演算法思想:
換種說法:
先來看乙個例子,已知先序遍歷序列和中序遍歷序列求後序遍歷:
先序:abcdefgh
中序:bdceafhg
求後序:
分析:要求後序遍歷序列,必須求出原始二叉樹
先看先序序列a第乙個出現,有先序遍歷的定義可以知道a是根結點
再看中序遍歷,a的左邊是bdce,而a的右邊是fhg
bdce哪個是根呢?答案還是從先序遍歷找,因為先序遍歷根最先出現
再看b、d、c、e中在先序遍歷中最先出現的是b,所以b是bdce中的根,
由於b是根,在看中序遍歷中b左端沒有樹,所以dce是b的右子樹
而在dce中,誰又是根?
同樣的我們看先序遍歷序列c先出現,所以c是dce中的根,
而此時在中序遍歷中c的左端只有乙個d,c的右端只有乙個e
根據中序遍歷的定義d是c的左子樹,e是c的右子樹
接著我們再看fhg,f、h、g在先序遍歷中最先出現的是f,所以f是fhg中的根,
再回到中序遍歷fhg中f左端再沒有結點,右端是hg所以hg是f的右子樹
再看hg中誰是根,在先序遍歷中g先出現,所以g是根
再看中序遍歷,g的左端只有乙個h,右端沒有子樹,說明h是g的左子樹
這樣我們就得到了乙個原始二叉樹,題目的要求是讓求這個二叉樹的後序遍歷序列,
這樣我們可以根據二叉樹後序遍歷的定義
寫出該二叉樹的後序遍歷序列:decbhgfa
以上**至:
演算法實現:
1 #include2 #include3 #include4
using
namespace
std;
5const
int n=33;6
intz[n],h[n],x[n],n;7//
已知中序後序 求先序
8void dfs(int r,int zl,int
zr)9
18//
已知中序先序 求後序
19void dfs2(int l,int zl,int
zr)20
28int
main()
29
二叉樹遍歷(已知先序 中序求後序)
時間限制 1000 ms 記憶體限制 65536 kb 提交數 11 通過數 9 輸入一棵二叉樹的先序和中序遍歷序列,輸出其後序遍歷序列。共兩行,第一行乙個字串,表示樹的先序遍歷,第二行乙個字串,表示樹的中序遍歷。樹的結點一律用小寫字母表示。一行,表示樹的後序遍歷序列。abdec dbeac deb...
二叉樹 已知後序 中序遍歷,求先序遍歷
二叉樹後序遍歷序列是dabec,中序遍歷序列debac,它的前序遍歷的序列是什麼 1.由後序 lrd 得知c肯定為根結點 2.由中序 ldr 以c為根節點該樹必然只有左子樹 3.先從後序入樹 dabec 由遍歷規則得知,e 為第二層節點 於是有ce 4.結合中序遍歷debac觀察節點,由於 e為第二...
二叉樹遍歷 已知先序和中序,求後序遍歷
如下 include include include include using namespace std 先定義樹的結構體 struct treenode 建樹 treenode build string preorder,string inorder 先序的第乙個結點為樹的根節點 char c...