二叉树找后继节点

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;
    }


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值