給定一棵二叉樹的前序遍歷和中序遍歷的結果,求其後序遍歷。
輸入輸入可能有多組,以eof結束。
每組輸入包含兩個字串,分別為樹的前序遍歷和中序遍歷。每個字串中只包含大寫字母且互不重複。輸出對於每組輸入,用一行來輸出它後序遍歷結果。樣例輸入
dbacegf abcdefg樣例輸出bcad cbad
acbfgedcdab
題意:題目很簡單,給出一棵樹的前序遍歷和中序遍歷求它的後序遍歷(多組資料)
那麼讓我們回顧一下樹的三種遍歷
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 #include3void 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#includevoid 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...