面試題58:二叉樹的下一個結點
阿新 • • 發佈:2019-01-06
這個題是在《劍指offer》的英文版新增的面試題,但今天花了我大半天的時間去理解。
題目描述:給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL ), next(NULL) {
}
};
這是牛客給出的結構,講真最開始一直很懵逼,這個next是啥,最後才明白是parent的意思。因為這個樹有一個結點是指向父親的。那麼下面我們來分析這個問題。
首先這是一棵按照要求構造的樹。假如我們要找的是4中序遍歷的下一個結點,毫無疑問是返回next就OK了。如果是2的下一個結點呢?這裡就有點複雜了,因為在中序遍歷下,先遍歷的是右子樹的最左結點,也就是圖中的8。在假如當前結點是9,那麼下一個結點是1,也就是說在這種情況下,當前結點是根的右子樹且沒有右子樹,那麼我們就需要向上尋找,找到某個結點,滿足父節點是它的左子樹這個要求。對7這個結點來說也是一樣的,我們尋找某個結點,但是1沒有父節點了,所以g沒有next結點。情況分類如下。
說完可能出現的情況,我們直接根據情況上程式碼。
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL)
return NULL;
TreeLinkNode* nextnode=NULL;
TreeLinkNode* cur=pNode;
if(cur->right!=NULL) //找2的下一個
{
TreeLinkNode* RightNode=cur->right;
while(RightNode->left!=NULL)
RightNode=RightNode->left;
nextnode=RightNode;
}
else if(cur->next!=NULL) // 4和9的情況
{
TreeLinkNode* parent=cur->next;
while(parent!=NULL && cur==parent->right) //找9的下一個
{
cur=parent;
parent=parent->next;
}
nextnode=parent;
}
return nextnode;
}
};
其實這道題分情況討論並不難,但是在開始的理解題意花了很長的時間。但對於這種情況比較多的題目,先將問題理解明白,然後根據每種情況去討論問題就會迎刃而解。