1. 程式人生 > >劍指offer----二叉樹的下一個結點

劍指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) {
        
    }
};
*/
//分三種情況:
//1、當pNode為NULL,直接返回NULL
//2、當pNode的右孩子不為空,則返回中序遍歷右子樹的第一個結點即可
//3、當pNode的右孩子為空時,則代表以pNode為根的子樹已經遍歷完成
//   返回到父節點,如果pNode是父節點的左孩子,則下一個遍歷結點就是
//   父節點,如果pNode是父節點的右孩子,則代表以pNode的父節點為根
//   的子樹已經遍歷完成,繼續向上尋找。(有可能父節點為空,代表整個樹
     遍歷完成,也返回空值)
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        if(pNode==NULL)return NULL;
        if(pNode->right==NULL)
        {
            if(pNode->next!=NULL&&pNode==pNode->next->left)
            return pNode->next;
            else if(pNode->next==NULL)return NULL;
            else
            {
                auto ptr=pNode;
                while(ptr->next!=NULL&&ptr==ptr->next->right)
                {
                    ptr=ptr->next;
                }
                return ptr->next;
            }
        }
        else
        {
            TreeLinkNode* ptr=pNode->right;
            while(ptr->left!=NULL)
            {
                ptr=ptr->left;
            }
            return ptr;
        }
    }
};