57、二叉树的下一个结点

题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
中序排序:左中右
在这里插入图片描述
第一种情况:

就是一个节点有右子树。比如要求节点B的下一个节点,其实是找到它的右子树的最左孩子,就是G节点。

第二种情况,就是一个节点没有右子树,此时又可以分为两种情况。

**对于G这个节点来说,**没有右子节点了,它的父亲节点是E,G是E的左子节点,即E的左子节点是G,那么G的下一个节点就是E。

对于E这个节点来说,也没有右子节点,它的父亲节点是B,此时E是B的右子节点,根据实际情况来说,E的下一个节点绝对不是B,因为E是B的右子节点,根据中序遍历的规则,此时肯定是先遍历B再遍历E,所以B肯定在E的前面,而不是后面,所以我们还需要再往上找父亲节点,此时B的父亲节点为A,B为A的左子节点,此时根据实际情况,A就是我们要找的E的下一个节点。

所以,对于一个没有右子节点的节点来说,只需要判断它有没有父节点并且是不是父节点的左子节点,是的话,就找到了,不是则要不断地向上找。

如果一直找到根还是找不到,像节点F,那就返回null,因为实际上F节点就是中序遍历的最后一个节点,没有所谓的下一个节点了。
代码

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode == null) return null;
        //判断当前结点是否有右子结点,有的话去里面找
        if(pNode.right != null){
            return nextInRightTree(pNode);
        //没有右子结点,去父结点找
        }else{
            //直到找到符合条件的父结点为止,跳出循环时,pNode的父结点符合条件,这个父结点就是我们要的
            //next指的是该节点的父结点,
            while(pNode.next != null && pNode.next.left != pNode){
                pNode = pNode.next;
            }
            //跳出while循环说明父结点为null,或者该节点是父结点的左子节点(即找到了 )
            return pNode.next;
        }
    }
    //到右子树中找到符合条件的,显然就是找到最最左边的左子结点即可
    private TreeLinkNode nextInRightTree(TreeLinkNode pNode){
        TreeLinkNode cur = pNode.right;
        while(cur.left != null){
            cur = cur.left;
        }
        return cur;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值