面試題8:二叉樹的下一個節點

題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點而且返回。注意,樹中的結點不只包含左右子結點,同時包含指向父結點的指針。

編程思想

根據中序遍歷的特色:左根右。可分爲三種狀況: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

相關文章
相關標籤/搜索