九度OJ 1078 二叉樹遍歷

2021-07-29 16:22:24 字數 1922 閱讀 2924

題目描述:

輸入:兩個字串,其長度n均小於等於26。

第一行為前序遍歷,第二行為中序遍歷。

二叉樹中的結點名稱以大寫字母表示:a,b,c....最多26個結點。

輸出:輸入樣例可能有多組,對於每組測試樣例,

輸出一行,為後序遍歷的字串。

樣例輸入:

abc

bacfdxeag

xdefag

樣例輸出:

bca

xedgaf

解題思路:

由該例要求,首先我們需要根據給定的二叉樹前序和中序遍歷結果還原該二叉樹。其次,我們需要將還原的二叉樹以二叉樹的形式儲存在記憶體中。最後,我們需要對建立的二叉樹進行後序遍歷。

由給定的前序和中序遍歷還原得到該二叉樹。以前序遍歷結果

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...