二叉树的下一个节点

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

思路:中序遍历的顺序是先访问左子节点再访问父亲节点再访问右子节点,而本题是为了获取中序遍历的下一个节点,所以必须需要考虑到右子节点的情况

  1. 当该节点的右子节点不为空时,为了获取该节点的中序遍历的下一个节点,就必须去右子节点查找
    当右子节点存在左子树的时候,就需要遍历到它的左子树,直到某个节点的左子节点为空
    如果不存在左子树,则直接将右子节点返回
  2. 当该节点的右子节点为空时,这种情况比较复杂
    如果该节点是父节点,那么它的右子节点为空,中序遍历的下一个节点也为空
    如果该节点不是父节点,并且它是它父节点的左子节点,那么该节点的中序遍历的下一个节点为它的父节点
    如果该节点不是父节点,并且它是它父节点的右子节点,该节点的中序遍历的下一个节点是第一个以它的父节点(祖爷)为左节点的节点.
/*
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)
    {
         
        // 如果当前节点等于Null
          if(pNode==null){
              return null;
          }
        TreeLinkNode curNode = pNode;
        // 右子树为空
        if(curNode.right!=null){
             curNode = curNode.right;
             //左子树不为空,遍历左子树
            while(curNode.left!=null){
                curNode = curNode.left;
            }
            return curNode;
        }
        // 右子树为空
         if(curNode.right==null){
         // 当前节点为根节点直接返回curNode.next;(null)
         // 当前节不是根节点,并且该节点等于该为其父节点的左子节点
             if(curNode.next==null||curNode==curNode.next.left){
                 return curNode.next;
             }
             // 如果该节点不是父节点,并且它是它父节点的右子节点,该节点的中序遍历的下一个节点是第一个以它的父节点(祖爷)为左节点的节点
             while(curNode.next!=null&&curNode.next.left!=curNode){
                 curNode = curNode.next;
             }
  
             return curNode.next;
         }
         return null;
            
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值