劍指offer面試題八:二叉樹的下一個節點
阿新 • • 發佈:2018-12-13
題目描述:
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
思路
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;
}