hihoCoder 1049 後序遍歷

2022-05-16 16:45:47 字數 1347 閱讀 7527

題意:

提供前序遍歷結果,和中序遍歷結果。輸出後序遍歷結果。最多26個節點,即從『a』~『z』。

思路:遞迴建立樹,再遞迴後續遍歷。前序遍歷的結果就是做了一次dfs的結果,所以可以從左到右順序來遍歷前序序列,每遇到1個字母就以其為乙個節點,建立以它為根的子樹,直到該子樹建立完成為止。怎麼判斷所建立的這個節點是葉子節點來斷定結束了呢?這要依靠中序序列了,中序中每個字母都能把一段子串行分開兩半,左邊是左子樹,右邊是右子樹。那麼操作在中序序列上,再以前序序列作為輔助。

注:一開始把前序起個名字為prev,結果編譯錯誤,改為pre就過了。

1 #include 2 #include 

3 #include 4

using

namespace

std;

5string

pre, medi;

6int

point;

7struct

node8;

1314 node *createnode(char

c)15

22 node* dfs(int a,int cur,int b) //

cur是根。在區間[a,b]中,cur將其分為兩棵子樹進行遞迴。

2332

if(b-cur!=0) //

找右孩子

3337

return p; //

返回整個子樹38}

39void sao(node *p) //

後續遍歷樹

4047

intmain()

48

ac**

看了大神的**是沒有建立樹,直接遞迴來輸出的。於是自己實現了一下,很ok!

1 #include 2 #include 

3using

namespace

std;45

string

pre, medi;

6int point; //

重點在這個變數,用於從左到右遍歷前序序列的。

7void dfs(int a,int cur,int b) //

cur是根。在區間[a,b]中,cur將其分為兩棵子樹進行遞迴。814

if(cur-a!=0

)15 dfs(a, medi.find(pre[++point]), cur-1

);16

if(b-cur!=0

)17 dfs(cur+1, medi.find(pre[++point]), b);

18 cout<

20int

main()

21

更短更易懂的ac**

hihoCoder 1049 後序遍歷

1049 後序遍歷 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述在參與過了美食節之後,小hi和小ho在別的地方又玩耍了一陣子,在這個過程中,小ho得到了乙個非常有意思的玩具 一棵由小球和木棍連線起來的二叉樹!小ho對這棵二叉樹愛不釋手,於是給它的每乙個節點都標記了乙...

hihoCoder 1049 後序遍歷

這裡參考了一位大神的 寫法很簡潔,思路其實就是這樣,學過先中後序遍歷的人,基本上都能看懂。每次進入遞迴程式之後,就找到根節點,然後把左子樹傳給遞迴程式,然後把右子樹傳給子遞迴程式,然後輸出這個根節點。include include using namespace std void post orde...

hihoCoder 1049 後序遍歷

time limit 10000ms case time limit 1000ms memory limit 256mb 描述 在參與過了美食節之後,小hi和小ho在別的地方又玩耍了一陣子,在這個過程中,小ho得到了乙個非常有意思的玩具 一棵由小球和木棍連線起來的二叉樹!小ho對這棵二叉樹愛不釋手,...