整理自劍指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;
}
};