【劍指Offer】面試題58:二叉樹的下一個結點

整理自劍指Offer


一:題目描述


給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。


二:解題分析

上圖紅色的是指向父結點的指針

上圖二叉樹中序遍歷的結果爲  d b h e i  a f c g


中序遍歷的順序:左子樹,根節點,右子樹


如果一個結點有右子樹,那麼它的下一個結點就是它右子樹中最左邊的結點,如a 的下一個結點 f

如果沒有右子樹,如果結點是它父結點的左孩子,那麼它下一個結點就是它的父結點,如 d 的下一個結點 b

如果一個結點沒有右子樹,並且他還是父結點的右孩子。可以沿着指向父結點的指針一直向上遍歷,直到找到一個是他父結點的左孩子的結點,如果這個節點存在,那麼這個節點的父結點就是我們要找的下一個結點,如i的下一個結點a  ,g沒有下一個結點

三:代碼實現

/*
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)
    {
        //結點爲NULL,返回NULL
        if(pNode==NULL)
            return NULL;
        
        TreeLinkNode* pTemp;
        //如果該結點有右子樹,它的下一個結點就是右子樹的最左子結點
        if(pNode->right!=NULL){
            pTemp=pNode->right;
            while(pTemp->left!=NULL){
                pTemp=pTemp->left;
            }
            return pTemp;   
        }
        
        //如果該結點是它父結點的左孩子,下一個結點就是它的父結點
        //1.根節點,沒有右子樹,下個節點爲空
        if(pNode->next==NULL)
            return NULL;
        //2.非根節點
        if(pNode->next->left==pNode)
            return pNode->next;
        
        //如果以上兩種情況均不滿足,該結點是其父結點的右孩子且該結點沒有右子樹
        //沿着父結點一直向上遍歷,知道找到一個是它父結點的左子結點的結點,如果存在,該結點的父結點就是我們的下一個結點
        pTemp=pNode;
        while(pTemp->next){
            //找到這樣的結點
            if(pTemp->next->left==pTemp){
                return pTemp->next;
            }
            pTemp=pTemp->next;

        }
        //未找到這樣的結點
        return NULL;
    }
};

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