重建二叉樹POJ2255

2022-05-20 19:30:00 字數 1251 閱讀 8311

給定一棵二叉樹的前序遍歷和中序遍歷的結果,求其後序遍歷。

輸入輸入可能有多組,以eof結束。

每組輸入包含兩個字串,分別為樹的前序遍歷和中序遍歷。每個字串中只包含大寫字母且互不重複。輸出對於每組輸入,用一行來輸出它後序遍歷結果。樣例輸入

dbacegf abcdefg

bcad cbad

樣例輸出

acbfged

cdab

題意:題目很簡單,給出一棵樹的前序遍歷和中序遍歷求它的後序遍歷(多組資料)

那麼讓我們回顧一下樹的三種遍歷

1.前序遍歷:根左右

2.中序遍歷:左根右

3.後序遍歷:左右根

真理:1.前序遍歷的第乙個點是根節點。

2.中序遍歷的根節點左側是樹的左子樹,根節點右側是樹的右子樹。

3.後序遍歷的最後乙個是根節點。

思路:假設中序遍歷中根節點的位置是a,那麼後序遍歷中0~a個點是樹的左子樹節點,a~n-2(陣列從0開始)個點是樹的右子樹節點。

神奇的函式:strchr()是string.h中的函式,strchr(a,b)返回b元素在字串a中第一次出現的位址c+a字串的位址(就是c+a陣列的位址)

貼上巨醜無比的**(注釋比**長qaq):

1 #include2 #include

3void bulid(int n,char s1,char s2)//

n是樹的節點數,s1是記錄先序遍歷,s2中序遍歷 419

intmain()

2027

return0;

28 }/*

29先序遍歷第乙個節點一定是根節點。

30中序遍歷根節點左側就是樹的左子樹,右側就是樹的右子樹。

31後序遍歷最後乙個節點一定是根節點,而假設中序序列里根節點位置是m,那麼

32後序序列裡0至m-1個節點是樹的左子樹節點,m至倒數第二個點是樹的右子樹節

33點。

34*/

下面給出不加注釋的**(**比較醜qwq)
#include#include

void bulid(int n,char s1,char

s2)int

main()

return0;

}

二叉樹 2255 重建二叉樹

總時間限制 1000ms 記憶體限制 65536kb 描述給定一棵二叉樹的前序遍歷和中序遍歷的結果,求其後序遍歷。輸入輸入可能有多組,以eof結束。每組輸入包含兩個字串,分別為樹的前序遍歷和中序遍歷。每個字串中只包含大寫字母且互不重複。輸出對於每組輸入,用一行來輸出它後序遍歷結果。樣例輸入 dbac...

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...