1. 程式人生 > >面試題58:二叉樹的下一個結點

面試題58:二叉樹的下一個結點

這個題是在《劍指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; } };

其實這道題分情況討論並不難,但是在開始的理解題意花了很長的時間。但對於這種情況比較多的題目,先將問題理解明白,然後根據每種情況去討論問題就會迎刃而解。