POJ 2255 Tree Recoveryw(二叉樹)
題目原網址:http://poj.org/problem?id=2255
題目中文翻譯:
Description
小瓦倫丁非常喜歡玩二叉樹。 她最喜歡的遊戲是用大寫字母構造的隨機二叉樹。
這是她的一個創作的例子:
D
/ \
/ \
B E
/ \ \
/ \ \
A C G
/
/
F
為了為後代記錄她的樹,她為每棵樹寫了兩個字符串:前序遍歷(根,左子樹,右子樹)和中序遍歷(左子樹,根,右子樹)。 對於上面繪制的樹,前序遍歷是DBACEGF,中序遍歷是ABCDEFG。
她認為這樣一對字符串會提供足夠的信息來重建樹(但她從未嘗試過)。
現在,多年以後,再次看到這些字符串,她意識到重建樹確實是可能的,因為她從未在同一棵樹上使用過兩次相同的字母。
然而,手工重建很快就變得單調乏味。
所以現在她要求你寫一個為她工作的程序!
Input
輸入將包含一個或多個測試用例。
每個測試用例由一行包含兩個字符串preord和inord,表示二叉樹的前序遍歷和中序遍歷。 兩個字符串都由不重復的大寫字母組成。 (因此它們不超過26個字符。)
輸入由文件結束(EOF)終止。
Output
對於每個測試用例,恢復瓦倫丁的二叉樹並打印一行樹的後序遍歷(左子樹,右子樹,根)。
Sample Input
DBACEGF ABCDEFG
BCAD CBAD
Sample Output
ACBFGED
CDAB
解題思路:
通過先序遍歷找到根,再根據中序遍歷性質(一個節點的左兒子一定在它前面出現,而右兒子一定在它後面),找出這個節點的左右兒子,建樹,最後輸出後序遍歷.
AC代碼:
1 #include<cstdio>
2 #include<iostream>
3 #include<string>
4 #include<algorithm>
5 #include<cstring>
6
7 using namespace std;
8
9 char q[30],z[30];
10 int xb;
11
12 void work(int l,int r) {
13 char a;
14 int i;
15 if(l > r) return ;
16 a = q[xb++];
17 for(i = l;i <= r; i++)
18 if(a == z[i])
19 break;
20 work(l,i - 1);
21 work(i + 1,r);
22 cout << a;
23 }
24
25 int main()
26 {
27 while(scanf("%s%s",q,z) != EOF) {
28 getchar();
29 int len = strlen(z);
30 xb = 0;
31 work(0,len-1);
32 cout << endl;
33 }
34
35 return 0;
36 }
POJ 2255 Tree Recoveryw(二叉樹)