給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度<=8)。
輸入格式:
2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。
輸出格式:
1行,表示一棵二叉樹的先序。
輸入樣例#1:
badcbdca
輸出樣例#1:
abcd
中序和後序確定前序的規則
後序的最後乙個值一定是根節點 然後掃瞄中序排列 找到根節點, 中序排列的左邊為左子樹,右邊為右子樹。之後 後序排列是後跟形式的 換句話說
中序序列去掉根節點左邊的數目,和後序排列前後數同樣的數目 為左子樹
之後進入遞迴
以下是大神的解釋 摘自洛谷題解, 比較清晰
debafcg
edbfgca
首先這棵樹的根是a(後序排列的最後乙個),輸出a;
然後在中序排列中找到a的位置,發現它左右各有三個點,分別是它的左右子樹;
把中序排列左邊三個點和後序排列的前三個點作為左子樹去dfs,因為先序排列是中-左-右,所以先走左邊;
> [l]傳入的中序是deb,後序是edb - 輸出b,de是左子樹,同樣操作;
>> [l]傳入的中序是de,後序是ed - 輸出d,e是右子樹,同樣操作;
>>> [r]傳入的中序是e,後序是e - 輸出e;
> [r]傳入的中序是fcg,後序是fgc - 輸出c,f是左子樹,同樣操作,g是右子樹,同樣操作;
>> [l] 傳入的中序是f,後序是f - 輸出f;
>> [r] 傳入的中序是g,後序是g - 輸出g;
這樣我們就完成了求先序遍歷的過程。(上面略去了l/r子樹為空的場合。
#include #include #include #include #include #include #include #include #include using namespace std;
string mid;
string last;
void dfs(int l,int r,int z,int y)
洛谷 P1030 求先序排列
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度8 8 輸入格式 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。輸出格式 1行,表示一棵二叉樹的先序。思路 1.通過後序找根節點 2.通過根節點回中序劃分左右子樹 3.重複1,2 ps 雖然思路蠻清...
洛谷P1030(求先序排列)
給出一棵二叉樹的中序與後序排列。求出它的先序排列。約定樹結點用不同的大寫字母表示,長度 8 2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。1行,表示一棵二叉樹的先序。這是一道二叉樹的題目,當時老師是布置過這個題目的,但是我當時是用遞迴做的,但是我當時年輕,老師問了一句如果資料量100...
洛谷P1030求先序排列
在這裡做個小總結吧 對於樹的三種遍歷 如果給定前序遍歷和後序遍歷,中序遍歷不一定是確定的 但是給定中序與後序排列,是可以確定前序的 並且給定前序和中序也是可以確定後序的。這道題就討論第二種情況 重點就是先找到根,然後在遞迴就可以了 define crt secure no warnings incl...