題意:
提供前序遍歷結果,和中序遍歷結果。輸出後序遍歷結果。最多26個節點,即從『a』~『z』。
思路:遞迴建立樹,再遞迴後續遍歷。前序遍歷的結果就是做了一次dfs的結果,所以可以從左到右順序來遍歷前序序列,每遇到1個字母就以其為乙個節點,建立以它為根的子樹,直到該子樹建立完成為止。怎麼判斷所建立的這個節點是葉子節點來斷定結束了呢?這要依靠中序序列了,中序中每個字母都能把一段子串行分開兩半,左邊是左子樹,右邊是右子樹。那麼操作在中序序列上,再以前序序列作為輔助。
注:一開始把前序起個名字為prev,結果編譯錯誤,改為pre就過了。
1 #include 2 #includeac**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
看了大神的**是沒有建立樹,直接遞迴來輸出的。於是自己實現了一下,很ok!
1 #include 2 #include更短更易懂的ac**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
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對這棵二叉樹愛不釋手,...