《劍指offer》:[58]二叉樹的下一個結點
題目:給定一棵二叉樹和其中一個結點,如何找出中序遍歷順序的下一個結點?樹中的結點除了有兩個分別指向左右子結點的指標外,還有一個指向父節點的指標。
分析:這裡已經說了是中序遍歷,所以我們就以中序遍歷為例。由於是二叉樹,所以有三種情況;
(1)如果如果一個結點有右子樹,那麼它的下一個結點就是它的右子樹中最左子節點。也就是說從右子節點出發一直沿著指向左子結點的指標,我們就能找到它的
下一個結點。
(2)如果這個結點沒有右子樹,如果結點是它父節點的左子樹,則它的下一個結點就是它的父節點。
(3)如果一個結點沒有右子樹,並且是它父結點的右子樹,那麼旗下一個結點就是沿著指向父指標的結點向上找,直到找到一個是它父結點的左子結點的結點。如果這樣的結點存在則該結點的父節點就是下一個結點。
分析:這裡已經說了是中序遍歷,所以我們就以中序遍歷為例。由於是二叉樹,所以有三種情況;
(1)如果如果一個結點有右子樹,那麼它的下一個結點就是它的右子樹中最左子節點。也就是說從右子節點出發一直沿著指向左子結點的指標,我們就能找到它的
下一個結點。
(2)如果這個結點沒有右子樹,如果結點是它父節點的左子樹,則它的下一個結點就是它的父節點。
(3)如果一個結點沒有右子樹,並且是它父結點的右子樹,那麼旗下一個結點就是沿著指向父指標的結點向上找,直到找到一個是它父結點的左子結點的結點。如果這樣的結點存在則該結點的父節點就是下一個結點。
說的可能不直觀,我們用3張圖來來直觀的解釋一下上述三種情況,因為我覺得一張簡單的圖遠比長篇大論要簡潔易懂,所以我的筆記裡有很多圖,可能畫的不好!
#include <iostream>
using namespace std;
struct BinaryTree
{
int data;
BinaryTree *pLeft;
BinaryTree *pRight;
BinaryTree *pParent;
};
BinaryTree *pRoot=NULL;
int arr[7]={10,6,15,4,5,12,18};
void InSertTree(BinaryTree *root1,int data)
{
//插入在左邊;
if(root1->data > data)
{
if(root1->pLeft==NULL)
{
BinaryTree *node=new BinaryTree;
node->data=data;
node->pLeft=node->pRight=NULL;
node->pParent=root1;
root1->pLeft=node;
}
else
{
InSertTree(root1->pLeft,data);
}
}
//插入在右邊;
else
{
if(root1->pRight==NULL)
{
BinaryTree *node=new BinaryTree;
node->data=data;
node->pLeft=node->pRight=NULL;
node->pParent=root1;
root1->pRight=node;
}
else
{
InSertTree(root1->pRight,data);
}
}
}
void CreateTree(BinaryTree **root,int length,int *array)
{
for(int i=0;i<length;i++)
{
if(*root==NULL)
{
BinaryTree *pNode=new BinaryTree;
pNode->data=array[i];
pNode->pLeft=pNode->pRight=NULL;
*root=pNode;
}
else
InSertTree(*root,array[i]);
}
}
BinaryTree *GetNextNode(BinaryTree* pNode)
{
if(pNode==NULL)
return NULL;
BinaryTree *pNext=NULL;
if(pNode->pRight!=NULL)
{
BinaryTree *right=pNode->pRight;
while(right->pLeft!=NULL)
right=right->pLeft;//找到最左邊的一個節點;
pNext=right;
}
else if(pNode->pParent!=NULL)
{
BinaryTree *pCurrent=pNode;
BinaryTree *parent=pNode->pParent;
while(parent!=NULL && pCurrent==parent->pRight)
{
pCurrent=parent;
parent=parent->pParent;
}
pNext=parent;
}
return pNext;
}
int main()
{
BinaryTree *result=NULL;
CreateTree(&pRoot,7,arr);
result=GetNextNode(pRoot);
if(NULL==result)
cout<<"輸入的結點不存在!"<<endl;
else
cout<<pRoot->data<<"的下一個結點為:"<<result->data<<endl;
system("pause");
return 0;
}
輸入的二叉樹是:
執行結果:
相關文章
- (python版)《劍指Offer》JZ57:二叉樹的下一個結點Python二叉樹
- 劍指offer 面試題 7 :二叉樹的下一個節點是什麼?面試題二叉樹
- 劍指offer——重建二叉樹二叉樹
- 【劍指offer】二叉樹深度二叉樹
- 劍指offer(四)重建二叉樹二叉樹
- 【劍指offer】樹的子結構
- 劍指Offer-40-二叉樹的深度二叉樹
- 劍指offer——二叉樹的映象C++二叉樹C++
- 【劍指offer】27. 二叉樹的映象二叉樹
- 劍指offer——二叉樹的深度C++二叉樹C++
- 《劍指offer》:[59]對稱的二叉樹二叉樹
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- 劍指 Offer 07. 重建二叉樹二叉樹
- 【劍指offer】判斷二叉樹平衡二叉樹
- 《劍指offer》之在完全二叉樹中新增子節點二叉樹
- 劍指offer | 55 - I. 二叉樹的深度二叉樹
- [劍指offer] 把二叉樹列印成多行二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 【劍指offer】5.二叉樹的映象和列印二叉樹
- 力扣 - 劍指 Offer 27. 二叉樹的映象力扣二叉樹
- 劍指offer-17:樹的子結構
- 劍指offer面試18 樹的子結構面試
- 《劍指offer》:[60]把二叉樹列印成多行二叉樹
- 【劍指offer】從上向下列印二叉樹二叉樹
- # 劍指 Offer 68 - II. 二叉樹的最近公共祖先二叉樹
- 劍指offer(C++)——把二叉樹列印成多行C++二叉樹
- 【劍指offer】【4】根據前序和中序結果,重建二叉樹二叉樹
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- 劍指offer--把二叉樹列印成多行(C++)二叉樹C++
- 劍指offer——從上往下列印二叉樹C++二叉樹C++
- 《劍指offer》:[61]按之字形順序列印二叉樹二叉樹
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 每日一題 - 劍指 Offer 54. 二叉搜尋樹的第k大節點每日一題
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III二叉樹
- 《劍指offer》:[39-1]判斷是否為平衡二叉樹二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 劍指offer:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。二叉樹
- 劍指offer(java實現)第4題“重建二叉樹”-牛客網Java二叉樹