今天來總結下二叉樹前序、中序、後序遍歷相互求法,即如果知道兩個的遍歷,如何求第三種遍歷方法,比較笨的方法是畫出來二叉樹,然後根據各種遍歷不同的特性來求,也可以程式設計求出,下面我們分別說明。
首先,我們看看前序、中序、後序遍歷的特性:
前序遍歷:
1.訪問根節點
2.前序遍歷左子樹
3.前序遍歷右子樹
中序遍歷:
1.中序遍歷左子樹
2.訪問根節點
3.中序遍歷右子樹
後序遍歷:
1.後序遍歷左子樹
2.後序遍歷右子樹
3.訪問根節點
一、已知前序、中序遍歷,求後序遍歷例:
前序遍歷: gdafemhz
中序遍歷: adefghmz
畫樹求法:第一步,根據前序遍歷的特點,我們知道根結點為g
第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。
第三步,觀察左子樹adef,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root之後,所以左子樹的根節點為d。
第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。
第五步,觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。該步遞迴的過程可以簡潔表達如下:
1 確定根,確定左子樹,確定右子樹。
2 在左子樹中遞迴。
3 在右子樹中遞迴。
4 列印當前根。
那麼,我們可以畫出這個二叉樹的形狀:
那麼,根據後序的遍歷規則,我們可以知道,後序遍歷順序為:aefdhzmg
題意如下
描述給定一棵二叉樹的前序遍歷和中序遍歷的結果,求其後序遍歷。
輸入輸入可能有多組,以eof結束。
每組輸入包含兩個字串,分別為樹的前序遍歷和中序遍歷。每個字串中只包含大寫字母且互不重複。
輸出對於每組輸入,用一行來輸出它後序遍歷結果。
樣例輸入
dbacegf abcdefg樣例輸出bcad cbad
acbfged可以比較容易得到演算法如下cdab
這道題的坑點在於 怎麼判斷輸入多組以eof結束
常見的方法有while(scanf("%s", str)!=eof)或者 while (cin>>str)
宣告乙個字串的方法如下
宣告乙個字串變數很簡單:
string str;
這樣我們就宣告了乙個字串變數,但既然是乙個類,就有建構函式和析構函式。上面的宣告沒有傳入引數,所以就直接使用了string的預設的建構函式,這個函式所作的就是把str初始化為乙個空字串。string類的建構函式和析構函式如下:
a) string s; //生成乙個空字串s
b) string s(str) //拷貝建構函式 生成str的複製品
c) string s(str,stridx) //將字串str內「始於位置stridx」的部分當作字串的初值
d) string s(str,stridx,strlen) //將字串str內「始於stridx且長度頂多strlen」的部分作為字串的初值
e) string s(cstr) //將c字串作為s的初值
f) string s(chars,chars_len) //將c字串前chars_len個字元作為字串s的初值。
g) string s(num,c) //生成乙個字串,包含num個c字元
h) string s(beg,end) //以區間beg;end(不包含end)內的字元作為字串s的初值
i) s.~string() //銷毀所有字元,釋放記憶體
**如下 //
#include "stdafx.h"
#include#includeusing namespace std;
struct treenode
;string str1, str2;
void createtree(string pre, string mid, int len) //前序遍歷的是pre, 中序遍歷的是mid, 長度為len
string pre1(pre, 1, rootindex); //左子樹上 前序遍歷從pre[1...rootindex]
string mid1(mid, 0, rootindex); //左子樹上 中序遍歷是mid[0...rootindex-1]
createtree(pre1, mid1, rootindex); //先遍歷左子樹
string pre2(pre, rootindex + 1, len - (rootindex + 1)); //右子樹上, 長度為len-(rootindex+1)自己推理一下即可
string mid2(mid, rootindex + 1, len - (rootindex + 1));
createtree(pre2, mid2, len - (rootindex + 1)); //再遍歷右子樹
cout << root_ch; //回來後輸出當前節點 root_ch
}int main()}
二叉樹 前序遍歷 中序遍歷 後序遍歷
前序遍歷 dlr 是二叉樹遍歷的一種,也叫做先跟遍歷,先序遍歷,前序周遊,可記做根左右。前序遍歷首先訪問根節點然後遍歷左子樹,最後遍歷右子樹。前序遍歷首先訪問根節點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根節點,然後遍歷左子樹,最後遍歷右子樹。若二叉樹為空則結束返回,否則 1 ...
二叉樹 前序遍歷 中序遍歷和後序遍歷
定義 樹是由結點或頂點和邊組成的 可能是非線性的 且不存在著任何環的一種資料結構。沒有結點的樹稱為空 null或empty 樹。一棵非空的樹包括乙個根結點,還 很可能 有多個附加結點,所有結點構成乙個多級分層結構。特點 樹狀圖是一種資料結構,它是由n n 0 個有限結點組成乙個具有層次關係的集合。把...
樹 前序遍歷,中序遍歷,後序遍歷
前序遍歷 void first treenode tr if tr null cout tr data 訪問根節點 first tr left 前序遍歷左子樹 first tr right 前序遍歷右子樹 中序遍歷 void second treenode tr if tr null second ...