剑指Offer(java语言)--二叉树的下一个节点(树)

题目:

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

知识点:

二叉树的中序遍历:左、根、右。

二叉树的前序遍历:根、左、右。

二叉树的后序遍历:左、右、根。

思路:

由于二叉树的中序遍历是:左、根、右。因此,拿到的节点一定已经遍历完它的左子树了。

1、如果该节点的右子树不为空,

如果右子树的左节点不为空,返回右子树的最深左节点;

返回右子树根节点;

2、如果该节点根不为空,

如果根的右子树不是它自己,则返回根节点;

如果根的右子树是它自己,继续向上遍历,找根节点,循环条件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)
    {
        if(pNode==null){return null;}
        /*if(pNode.left!=null){//左子树已经遍历完
            while(pNode.left!=null){
                pNode = pNode.left;
            }
            return pNode;
        }*/
        if(pNode.right!=null){
            TreeLinkNode p = pNode.right;
            while(p.left!=null){
                p = p.left;
            }
            return p;
        }
        if(pNode.next!=null){
            while(pNode.next!=null){
                if(pNode.next.right!=pNode){
                    return pNode.next;
                }else{
                    pNode = pNode.next;
                }
            }
        }
        return null;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章