題目描述:
輸入:兩個字串,其長度n均小於等於26。
第一行為前序遍歷,第二行為中序遍歷。
二叉樹中的結點名稱以大寫字母表示:a,b,c....最多26個結點。
輸出:輸入樣例可能有多組,對於每組測試樣例,
輸出一行,為後序遍歷的字串。
樣例輸入:
abcbacfdxeag
xdefag
樣例輸出:
bcaxedgaf
解題思路:
由該例要求,首先我們需要根據給定的二叉樹前序和中序遍歷結果還原該二叉樹。其次,我們需要將還原的二叉樹以二叉樹的形式儲存在記憶體中。最後,我們需要對建立的二叉樹進行後序遍歷。
由給定的前序和中序遍歷還原得到該二叉樹。以前序遍歷結果
xdagfe
,和中序遍歷結果
adgxfe
為例詳細討論其還原方法。
由前序遍歷結果的首個元素為
x 可知,原樹必是由
x 為根結點。在中序遍歷中,遍歷結果
adgxfe 以 x
為界分為兩個子串。其中第乙個子串
adg為
x的左子樹的中序遍歷結果,第二個子串
fe 為
x的右子樹的中序遍歷結果。這樣我們知道
x的左子樹具有
3 個元素,
x 的右子樹具有
2個元素。根據元素的數量我們同樣可以得知,在先序遍歷中去除根結點
x後剩餘的串
dagfe
中,前
3個字元
dag 為 x
的左子樹的前序遍歷結果,後
2 個字元
fe 為
x 的右子樹的前序遍歷結果。
同樣的對於確定的左子樹前序遍歷結果
dag
和中序遍歷結果
adg
重複以上確定過程,可知
d 為該子樹根結點,其左兒子為
a,右兒子為g。
x 的右子樹前序遍歷結果
fe 和中序遍歷結果
fe同樣可以確定該子樹以
f為根節點,其左兒子不存在,右兒子為
e。這樣我們就還原了原始二叉樹。
我們還需將還原出來的樹儲存在記憶體中。使用結構體:
struct node
表示樹的乙個結點,其字元資訊儲存在字元變數
c,若該結點存在左兒子或者右兒子,則指向他們的指標儲存在
lchild
或 rchild
中,否則該指標為空。
#include
#include
struct node//樹結點結構體
tree[50];//靜態記憶體分配陣列
int loc;//靜態陣列中已經分配的結點個數
node *creat()//申請乙個結點空間,返回指向其的指標
char str1[30],str2[30];//儲存前序和中序遍歷結果字串
void postorder(node *t)//後續遍歷
if(t->rchild!=null)//若右子樹不為空
printf("%c",t->c);//遍歷該結點,輸出其字元資訊
}node *build(int s1,int e1,int s2,int e2)
} if(rootidx!=s2)//若左子樹不為空
if(rootidx!=e2)
//遞迴還原其右子樹
return ret;//返回根結點指標
}int main()
return 0;
}
九度OJ 1078 二叉樹遍歷
題目描述 輸入 兩個字串,其長度n均小於等於26。第一行為前序遍歷,第二行為中序遍歷。二叉樹中的結點名稱以大寫字母表示 a,b,c.最多26個結點。輸出 輸入樣例可能有多組,對於每組測試樣例,輸出一行,為後序遍歷的字串。樣例輸入 abc bacfdxeag xdefag 樣例輸出 bca xedga...
九度OJ 1078 二叉樹遍歷
據機試指南說本題包括了建樹 遍歷 還原等多個考點,幾乎涉及機試二叉樹所有考點。所以吃透此題就好棒棒。寫完此題後與機試指南上一對照,應該說兩種方法在大體思路上別無二致。區別在於機試指南採用了具體的二叉樹結構,而我的 使用了乙個二維陣列來儲存二叉樹的游標,並沒有定義具體的二叉樹結構體,這是出於節省時空的...
重點 九度OJ 1078 二叉樹遍歷
本題涉及到二叉樹的建立 根據二叉樹的前序和後序重建二叉樹,後序遍歷二叉樹,是二叉樹的基本綜合題,這個題也是之前學習資料結構一直沒碰的題目,一定要重點複習,吃透了。題目描述 輸入 兩個字串,其長度n均小於等於26。第一行為前序遍歷,第二行為中序遍歷。二叉樹中的結點名稱以大寫字母表示 a,b,c.最多2...