劍指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;
    }
}

 

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