题目描述

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

 

分析:

中路遍历顺序:[左子树,父节点,右子树]

1、[左子树,当前节点,右子树],当前节点有右子树,那么下一个节点一定在右子树。

2、[当前节点,父节点,右子树],当前节点没有右子树,那么下一个节点一定是当前节点为左子树时的父节点。

3、[左子树,父节点,当前节点],没有下一个节点。

 

 

 

 

 

/*
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)
    {
        TreeLinkNode cur = pNode;
        //[左子树,当前节点,右子树]
        //如果有右子树,那么下一个节点一定在右子树的最左子树的节点。
        if(cur.right != null){
            cur = cur.right;
            while(cur.left != null){
                cur = cur.left;
            }
            return cur;
        }
        //[当前节点,父节点,右子树]
        //当没有右子树时,下一个节点一定是父节点的左子树。
        if(cur.next != null){
            TreeLinkNode par = cur.next;
            while(par != null && par.left != cur){
                cur = par;
                par = par.next;
            }
            if(par != null && par.left == cur){
                return par;
            }
        }
        return null;
    }
}