【劍指offer】二叉樹的下一個節點
阿新 • • 發佈:2018-11-10
給出一棵二叉樹和一個節點,求中序遍歷序列的下一個節點。二叉樹結構是給出了左右節點以及父節點的。
首先分析中序遍歷,中序遍歷即左父右的順序遍歷樹。
分析規律:
(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; }