根據前序 中序 後序遍歷還原二叉樹

2022-02-23 06:10:46 字數 2700 閱讀 3387

參考:

!首先我們得知道概念:

前序遍歷:先訪問當前節點,再訪問當前節點的左子樹,最後訪問當前節點的右子樹。對於二叉樹,深度遍歷與此同。規律:根在前;子樹在根後且左子樹比右子樹靠前,且第乙個就是根節點;

中序遍歷:先訪問當前節點的左子樹,然後訪問當前節點,最後是當前節點的右子樹,二叉樹,中序遍歷會得到資料公升序效果。規律:根在中;左子樹在跟左邊,右子樹在根右邊,左邊部分是根結點的左子樹的中序遍歷序列,右邊部分是根結點的右子樹的中序遍歷序列 ;

後序遍歷:先訪問當前節點的左子樹,然後是當前節點的又子樹,最後是當前節點。規律:根在後;子樹在根前且左子樹比右子樹靠前,且最後乙個節點是根節點。

一、前序+中序

1根據前序序列的第乙個元素建立根結點;

2在中序序列中找到該元素,確定根結點的左右子樹的中序序列;

3在前序序列中確定左右子樹的前序序列;

4由左子樹的前序序列和中序序列建立左子樹;

5由右子樹的前序序列和中序序列建立右子樹。

如:已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh、dgbaechf,求二叉樹及後序遍歷序列。

先序:abdgcefh—>a bdg cefh

中序:dgbaechf—->dgb a echf

得出結論:a是樹根,a有左子樹和右子樹,左子樹有bdg結點,右子樹有cefh結點。

先序:bdg—>b dg

中序:dgb —>dg b

得出結論:b是左子樹的根結點,b無右子樹,有左子樹。

先序:dg—->d g

中序:dg—–>dg

得出結論:d是b左子樹的根節點,d無左子樹,g是d的右子樹

然後對於a 的右子樹類似可以推出

最後還原: a

後序遍歷:gdbehfca

二、後序+中序:

已知一棵二叉樹的後序序列和中序序列,構造該二叉樹的過程如下:

1. 根據後序序列的最後乙個元素建立根結點;

2. 在中序序列中找到該元素,確定根結點的左右子樹的中序序列;

3. 在後序序列中確定左右子樹的後序序列;

4. 由左子樹的後序序列和中序序列建立左子樹;

5. 由右子樹的後序序列和中序序列建立右子樹

如還是上面題目:如:已知一棵二叉樹的後序遍歷序列和中序遍歷序列分別是gdbehfca、dgbaechf,求二叉樹

後序:gdbehfca—->gdb ehfc a

中序:dgbaechf—–>dgb a echf

得出結論:a是樹根,a有左子樹和右子樹,左子樹有bdg結點,右子樹有cefh結點。

後序:gdb—->gd b

中序:dgb—–>dg b

得出結論:b是a左子樹的根節點,無右子樹,有左子樹dg。

後序:gd—->g d

中序:dg—–>d g

得出結論:d是b的左子樹根節點,g是d的右子樹。

然後對於a 的右子樹類似可以推出。然後還原。

三、前序+後序

前序和後序在本質上都是將父節點與子結點進行分離,但並沒有指明左子樹和右子樹的能力,因此得到這兩個序列只能明確父子關係,而不能確定乙個二叉樹。 故此法無。不能唯一確定乙個二叉樹。

**如下(為了方便結點用數字表示)

#includeusing

namespace

std;

intn;

int pre[100

];int

in[100

];int back[100

];void

get(int root,int start,int

end)//求後序遍歷結果

void get1(int root,int start,int

end)//求前序遍歷結果

intmain()

cout

<< "

請輸入中序遍歷的結果

"<

memset(

in,0,sizeof(in

));

for(int i=0;i)

cout

<< "

求得後序遍歷的結果為:

"<

get(0,0,n-1

); cout

<

cout

<< "

************由中序遍歷和後序遍歷求前序遍歷*****************

"<

memset(back,

0,sizeof

(back));

memset(pre,

0,sizeof

(pre));

cout

<< "

請輸入後序遍歷的結果

"<

for(int i=0;i)

cout

<< "

請輸入中序遍歷的結果

"<

for(int i=0;i)

cout

<< "

求得前序遍歷的結果為

根據二叉樹前序 中序遍歷還原二叉樹

在學習二叉樹遍歷的時候我們學習了三種遍歷方法 前序 中序 後序 同時我們知道給定前序和中序 中序和後序我們可以還原二叉樹,記得當時只是在紙上畫了一畫。現在把當時的想法完成。給定前序和中序生成二叉樹。include 在學習二叉樹遍歷的時候我們學習了三種遍歷方法 前序 中序 後序 同時我們知道給定前序和...

二叉樹遍歷(前序,中序,後序

二叉樹的遍歷有三種方式,如下 1 前序遍歷 dlr 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。簡記根 左 右。2 中序遍歷 ldr 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。簡記左 根 右。3 後序遍歷 lrd 首先遍歷左子樹,然後遍歷右子樹,最後訪問根結點。簡記左 右 根。例1 如上圖...

前序中序和中序後序還原二叉樹

前序中序還原二叉樹 struct node creat int len,char str1,char str2 由先序序列和中序序列建立二叉樹 root lchild creat i,str1 1,str2 建立左子樹 root rchild creat len i 1,str1 i 1,str2 ...