- 题目描述:给一个二叉树的随机节点,查找这个节点的后继节点
- 前驱节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的前一个节点为该节点的前驱节点;
- 后继节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的后一个节点为该节点的后继节点;
思路一:直接遍历全部的二叉树,根据顺序直接得出结果,但是时间复杂度是O(N)
思路二:首先判断这个节点是否有右子树,有的话直接找到这个右子树的最左的节点就是我们的后继节点,如果没有右子树,那么,我们判断当前节点的父节点的左节点是不是当前节点,是的话直接返回父节点,不是的话继续向上寻找,引用之间再次传递。
public static class Node{
public int value;
public Node parent;
public Node left;
public Node right;
public Node(int value){
this.value = value;
}
}
public static Node getSuccessorNode(Node node){
if(node == null){
return null;
}
if(node.right != null){
return getRightNode(node.right);
}
Node parent = node.parent;
while (parent != null && node != parent.left){
node = parent;
parent = node.parent;
}
return parent