【Java - J - 08】二叉树的下一个节点

问题描述

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

练习地址

实现

方法:

  1. 右子树存在
  2. 右子树不存在
  • 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点。例如,寻找b的下一个节点的过程(b有右子节点e,e的左子节点是h,且h是e的最左节点,h是b的下一个节点)
  • 如果节点无右子节点,但该节点是父节点的左子节点,则父节点是该节点的下一个节点。例如,寻找d的下一个节点的过程(d无右子节点,d是父节点b的左子节点,则b是de的下一个节点)
  • 如果节点无右子节点,且该节点是父节点的右子节点,则沿着父节点的指针向上遍历。例如,寻找i的下一个节点的过程(i的父节点e,e是其父节点b的右子节点,节点b是其父节点a的左子节点,节点a是节点i的下一个节点)
/**8 二叉树的下一个节点*/
// 中序输出的下一个节点{d,b,h,e,i,a,f,c,g}
    //        a
    //     /     \
    //     b       c
    //   /   \   /   \
    //  d    e  f     g
    //      / \
    //     h   i
public class C08_tree_NextNode {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode next; // 父节点
        TreeNode(int x) {
            this.val = x;
        }
    }

    TreeNode getNextNode(TreeNode root) {
        if (root == null) return null;

        if (root.right != null) { // 1.如果有右子树,下一个节点
            root = root.right;
            while (root.left != null) {// 找右子树的最左节点
                root = root.left;
            }
            return root;
        }
        while (root.next != null) { // 2.没有右子树,找第一个当前节点 是父节点左孩子的 节点
            if (root.next.left == root) { // 根的左节点为当前值
                return root.next;
            }
            root = root.next; //后退
        }
        return null; //退到了根节点仍没找到,则返回null
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值