1. 程式人生 > >【劍指offer】二叉樹的下一個節點

【劍指offer】二叉樹的下一個節點

給出一棵二叉樹和一個節點,求中序遍歷序列的下一個節點。二叉樹結構是給出了左右節點以及父節點的。


首先分析中序遍歷,中序遍歷即左父右的順序遍歷樹。

分析規律:

(1)節點存在右節點 if(p->right)


則不斷檢查p->right是否還有左節點,若沒有左節點了,該節點即為res。

        if(pNode->right)     // 若存在右節點
        {
            TreeLinkNode* pRight = pNode->right;
            while(pRight->left) {            // 有左節點,則繼續搜尋;無左節點,則返回該點
                pRight = pRight->left;
            }
            nextNode = pRight;
        }

(2)節點不存在右節點,且該節點還存在父節點


如1與2,不斷判斷節點是否為父節點的左節點,若為左節點則說明該父節點為res

特例3,一直不滿足,則節點的父節點終會變為nullptr,結果即返回nullptr

else if(pNode->next) {     // 不為根節點且不存在右節點
            TreeLinkNode* pCurr = pNode;
            TreeLinkNode* pNext = pCurr->next;
            while(pNext && pCurr == pNext->right) {
                pCurr = pCurr->next;
                pNext = pNext->next;
            }
            nextNode = pNext;
        }

(3) 上兩者情況都不滿足,則說明是個沒有右節點的根節點,返回nullptr


TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(!pNode)
            return nullptr;
        TreeLinkNode* nextNode;
        if(pNode->right)     // 若存在右節點
        {
            TreeLinkNode* pRight = pNode->right;
            while(pRight->left) {            // 有左節點,則繼續搜尋;無左節點,則返回該點
                pRight = pRight->left;
            }
            nextNode = pRight;
        }
        else if(pNode->next) {     // 不為根節點且不存在右節點
            TreeLinkNode* pCurr = pNode;
            TreeLinkNode* pNext = pCurr->next;
            while(pNext && pCurr == pNext->right) {
                pCurr = pCurr->next;
                pNext = pNext->next;
            }
            nextNode = pNext;
        }
        return nextNode;
    }