class Node{
V value;
Node left;
Node right;
Node parent;
}
给你二叉树中的某个节点,返回该节点的后继节点。
后继节点:二叉树中序遍历中,处于某节点的下一个节点。
二叉树最重要的就是分类讨论,找到分类的标准最为关键!
这道题的分类标准,就是这个子树有没有右子树,如果有右子树,后继节点就是右子树的最左节点。
很容易理解,因为中序遍历是左中右顺序,以这个子树的根节点为头,遍历完根节点一定是去找右子树的最左子树。
那么如果没有右子树,就去找他的双亲节点第一个不为右子树的子树的根节点。
也不难理解,因为当这个节点没有右子树的时候,那么针对他所在的最小子树来说,左子树已经遍历完了,头节点也遍历完了,要去找右子树了,但是没有右子树,即对于这颗子树来说,遍历已经结束了,我要去找这个子树的头节点了,即找这个节点所在的最小左子树(不知道咋形容了,自己画一下就清楚了)。
代码如下:
/**
* @ProjectName: zxh1014
* @Package: class05
* @ClassName: FindParentNode
* @Author: zxh
* @Description:
* @Date: 2022/1/25 10:04
* @Version: 1.0
*/
public class FindParentNode {
class Node{
Integer value;
Node left;
Node right;
Node parent;
public Node(Integer value) {
this.value = value;
}
}
public static Node getSuccessorNode(Node node){
if(node==null){
return node;
}
/*讨论有右子树的情况*/
if(node.right!=null){
return mostLeftNode(node.right);
/*讨论没有的情况*/
} else {
Node parent = node.parent;
while(parent.left!=node && parent!=null){
node = parent;
parent = node.parent;
}
return parent;
}
}
public static Node mostLeftNode(Node node){
while(node.left!=null){
node = node.left;
}
return node;
}
}