洛谷 1030 先序排列

2021-07-25 10:06:16 字數 1106 閱讀 1674

給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不同的大寫字母表示,長度<=8)。

輸入格式:

2行,均為大寫字母組成的字串,表示一棵二叉樹的中序與後序排列。

輸出格式:

1行,表示一棵二叉樹的先序。

輸入樣例#1:

badc

bdca

輸出樣例#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...