public T successor(T value) {
		Node<T> currentNode = find(value);
		if (currentNode.getRightNode() != null) {
			Node<T> predecessorNode = currentNode.getRightNode();
			while (predecessorNode.getLeftNode() != null) {
				predecessorNode = predecessorNode.getLeftNode();
			}
			return predecessorNode.getValue();
		}
		else {
			Node<T> predecessorNode = currentNode.getParentNode();
			if (predecessorNode == null) {
				return null;
			}
			if (predecessorNode.getLeftNode() == currentNode) {
				return predecessorNode.getValue();
			}
			else {
				do {
					currentNode = predecessorNode;
					predecessorNode = predecessorNode.getParentNode();
				} while (predecessorNode != null && predecessorNode.getLeftNode() == currentNode);
					
				return predecessorNode != null? predecessorNode.getValue(): null;
			}			
		}
	}