根據中序遍歷的特色:左根右。可分爲三種狀況:1. 一個節點有右子樹,那麼它的下一個節點就是它的右子樹的最左子節點。2. 一個節點沒有右子樹且它仍是它父節點的左子節點,那麼它的下一個節點就是它的父節點。3. 一個節點沒有右子樹且它仍是它父節點的右子節點,那麼它的下一個節點就是含有左子節點的祖先節點。編程
/* 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 == nullptr) return nullptr; // 狀況1 if(pNode->right != nullptr) { pNode = pNode->right; while(pNode->left != nullptr) { pNode = pNode->left; } return pNode; } // 狀況2和3 while(pNode->next != nullptr) { // 節點的父節點 TreeLinkNode* pRoot = pNode->next; if(pRoot->left == pNode) //狀況2 { return pRoot; } //狀況3,繼續找它的父節點 pNode = pNode->next; } return nullptr; } };
細細分析可知,狀況2和3實際上是同一種狀況。同理,對於前序和後序的下一個節點也可如此分析。spa