1. 程式人生 > >劍指offer面試題八:二叉樹的下一個節點

劍指offer面試題八:二叉樹的下一個節點

題目描述:

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

思路

1.若該節點存在右子樹:則下一個節點為右子樹最左子節點(如圖節點 B )

2. 若該節點不存在右子樹:這時分兩種情況:

 1 該節點為父節點的左子節點,則下一個節點為其父節點(如圖節點 D )

 2 該節點為父節點的右子節點,則沿著父節點向上遍歷,知道找到一個節點的父節點的左子節點為該節點,則該節點的父節點下一個節點(如圖節點 I ,沿著父節點一直向上查詢找到 B ( B 為其父節點的左子節點),則 B 的父節點 A 為下一個節點)

/*
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)
    {
        
    }
};

牛客AC:

/*
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;
        if(pNode->right!=nullptr){  //如果有右子樹,則找右子樹的最左節點
            pNode=pNode->right;
            while(pNode->left!=nullptr){
                pNode=pNode->left;
            }
            return pNode;
        }
        while(pNode->next!=nullptr&&pNode==pNode->next->right){//沒右子樹,則找第一個當前節點是父節點左孩子的節點
            pNode=pNode->next;
        }
        return pNode->next;
    }
};

劍指offer:

BinaryTreeNode* GetNext(BinaryTreeNode* pNode){
    if(pNode==nullptr)return nullptr;
    BinaryTreeNode* ans=nullptr;
    if(pNode->rchild!=nullptr){//右子樹不為空尋找右子樹中最左邊那個
        pNode=pNode->rchild;
        while(pNode->lchild!=nullptr){
            pNode=pNode->lchild;
        }
        ans=pNode;
    }
    else
    if(pNode->father!=nullptr){//右子樹為空且父結點不為空(即父結點不是root),如果父結點為空,即當前元素為最後一個元素
        BinaryTreeNode* now=pNode;
        BinartTreeNode* pfather=pNode->fatehr;
        while(pfater!=nullptr&&now==pfather->rchild){//尋找父結點是其父結點的左孩子的的結點的父親為ans
            now=pfather;
            pfather=pfather->father;
        }
        ans=pfather;
    }
    return ans;
}