1. 程式人生 > 實用技巧 >劍指offer(五十七):二叉樹的下一個結點

劍指offer(五十七):二叉樹的下一個結點

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。 思路:一共有三種情況: 1.為空,直接返回null 2.該節點含有右子樹:那麼其中序遍歷的下一個結點就是其右子樹最左下的結點, 3.該節點不含右子樹:如果該節點是其父節點的左孩子,則返回父節點;否則繼續向上遍歷其父節點的父節點,重複之前的判斷,返回結果。

C++實現:

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(!pNode) return NULL; if(!pNode->right){//如果沒有右子樹 TreeLinkNode* p = pNode; TreeLinkNode* pFather = p->next; //如果沒有右子樹,那麼一直向上找,直到某一個結點是其父節點的左孩子,返回父節點 while
(pFather){ if(pFather->left == p){ return pFather; } p = pFather; pFather = p->next; } return NULL;//中序遍歷的最後一個結點 } else{//如果存在右子樹,那麼中序遍歷的下一個結點就是右子樹最左下結點 TreeLinkNode* pRight = pNode->right;
while(pRight->left){ pRight = pRight->left; } return pRight; } } };

相同的思路,java實現,程式碼稍微做了優化,但是思路是一致的

/*
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){
            TreeLinkNode p = pNode.right;
            while(p.left != null)
                p = p.left;
            return p;
        }
        while(pNode.next != null){
            if(pNode.next.left == pNode)
                return pNode.next;
            pNode = pNode.next;
        }
        return null;
    }
}