劍指offer之二叉樹的下一個結點
阿新 • • 發佈:2018-12-16
1.題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
2.問題分析
3.原始碼
// 例如: 1
// 2 3
// 4 6 7
// 中序遍歷是 4 2 1 6 3 7
我們分成兩種情況:
- 一種是:該節點的右子樹不為空,查詢該右子樹的中序遍歷的第一個節點,即:最左節點。例如:pNode是1,那麼下一個節點就是6;
- 另外一種是:該節點的右子樹為空,那麼需要回溯到該節點的父節點,來查詢。如果pNode是2,那麼下一個節點應該是1,我們發現1的左節點就是2節點,所以下一個節點是1。
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == NULL)
return NULL;
//右子樹存在,找右子樹的中序遍歷第一個節點,即:第一個左節點為空的節點
if(pNode->right != NULL)
{
TreeLinkNode* pRoot = pNode->right;
while(pRoot->left != NULL)
pRoot = pRoot->left;
return pRoot;
}
else
{
//找到第一個父節點的左節點與該節點相等,那麼該父節點就是我們要找的下一個節點
// 例如: 1
// 2 3
// 4 6 7
// 中序遍歷是 4 2 1 6 3 7
//如果pNode是2,那麼下一個節點應該是1,我們發現1的左節點就是2節點,所以下一個節點是1
while(pNode->next != NULL)
{
TreeLinkNode* parent = pNode-> next;
if(parent->left == pNode)
return parent;
pNode = parent;
}
return NULL;
}
}