利用二叉樹中序及先序遍歷確定該二叉樹的後序序列問題

2021-10-06 10:28:18 字數 2036 閱讀 5048

中序遍歷:bfdaegc

前序遍歷:abdfceg

根據中序遍歷和前序遍歷的性質:

1.前序遍歷,從左到右依次為根節點

2.中序遍歷,若我們找到乙個根節點,那麼在乙個範圍內,根節點的左邊為左子樹的節點,右邊為右子樹的節點。

大體過程:根據前序遍歷的節點確定根節點,再通過根節點在中序遍歷中確定該節點的左右子樹的節點。

步驟:1.前序遍歷abdfceg加粗的a即為根節點,在中序遍歷中bfdaegc,這樣即可確認節點a的左子樹的節點有bfd,右子樹的節點有egc,根據前序遍歷的性質左子樹的根節點為b,右子樹的根節點為c(**中有註解)

2.重複上述過程,直到確定了每個節點在後序遍歷中的位置。

這裡還有:利用二叉樹中序及後序遍歷確定該二叉樹的先序序列問題

**1(通過陣列):

#include

"bits/stdc++.h"

using

namespace std;

#define max 24

void

postorder

(char in,

char pre,

int root,

int start,

int end)

char rot=pre[root]

;//根節點

int index;

for(

int i=

0;i<

strlen

(in)

;i++)}

postorder

(in,pre,root+

1,start,index-1)

;//左子樹

postorder

(in,pre,root+index-start+

1,index+

1,end)

;//右子樹,index-start為左子樹有多少個節點,從而通過root+index-start+1即可在前序遍歷中得到右子樹的根節點位置

cout<}int

main()

/*in:

bfdaegc

abdfceg

out:

fdbgeca

*/

**2(通過string類):

#include

"bits/stdc++.h"

using

namespace std;

void

postorder

(string preorder,string inorder)

char root;

int k;

root=preorder[0]

; k=inorder.

find

(root)

;//找到root的索引

postorder

(preorder.

substr(1

,k),inorder.

substr(0

,k))

;//左子樹

postorder

(preorder.

substr

(k+1

),inorder.

substr

(k+1))

;//右子樹

cout<}int

main()

/*這裡對string.substr()說明一下:

若括號中為(0,5)則從索引為0的元素開始擷取5位即(0,1,2,3,4),

若括號中為(5)則從索引為5的元素開始擷取到末尾。

in:bfdaegc

abdfceg

out:

fdbgeca

*/

歡迎指正

利用二叉樹中序及先序遍歷確定該二叉樹的後序序列

已知二叉樹的中序和先序遍歷可以唯一確定後序遍歷 已知中序和後序遍歷可以唯一確定先序遍歷,但已知先序和後序,卻不一定能唯一確定中序遍歷。現要求根據輸入的中序遍歷結果及先序遍歷結果,要求輸出其後序遍歷結果。輸入輸入資料佔2行,其中第一行表示中序遍歷結果,第二行為先序遍歷結果。輸出對測試資料,輸出後序遍歷...

利用二叉樹中序及先序遍歷確定該二叉樹的後序序列

利用二叉樹中序及先序遍歷確定該二叉樹的後序序列 與上一題不同的是,先序序列中第乙個元素為當前根節點,在中序中找到該元素後,確定左子樹個數n和右子樹節點個數m,那麼先序序列中根節點後n個為其左子樹,接下來m個位其右子樹,然後遞迴處理 中序 bfda egc先序 abdf ceg include inc...

利用二叉樹中序及後序遍歷確定該二叉樹的先序序列

已知二叉樹的中序和先序遍歷可以唯一確定後序遍歷 已知中序和後序遍歷可以唯一確定先序遍歷,但已知先序和後序,卻不一定能唯一確定中序遍歷。現要求根據輸入的中序遍歷結果及後序遍歷結果,要求輸出其先序遍歷結果。輸入第一行為中序序列 第二行為後續序列輸出輸出為遍歷二叉樹得到的先序序列 樣例輸入bfdaegc ...