中序遍歷: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 ...