题目原网址: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 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/10739498.html