1. 程式人生 > >POJ 2255 Tree Recoveryw(二叉樹)

POJ 2255 Tree Recoveryw(二叉樹)

二叉 nbsp using getch align 題目 重建樹 pre lan

題目原網址: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(二叉樹)