USACO / American Heritage (经典递归入门)
描述
农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而不是用图形的方法。
你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多于26个的顶点。 这是在样例输入和样例输出中的树的图形表达方式:
C
/ \
/ \
B G
/ \ /
A D H
/ \
E F
树的中序遍历是按照左子树,根,右子树的顺序访问节点。
树的前序遍历是按照根,左子树,右子树的顺序访问节点。
树的后序遍历是按照左子树,右子树,根的顺序访问节点。
格式
PROGRAM NAME: heritage
INPUT FORMAT:
(file heritage.in)
第一行: 树的中序遍历
第二行: 同样的树的前序遍历
OUTPUT FORMAT:
(file heritage.out)
单独的一行表示该树的后序遍历。
SAMPLE INPUT
ABEDFCHG
CBADEFGH
SAMPLE OUTPUT
AEFDBHGC
分析:
经典的递归!第二个串中的第一个字符就是树根,然后这个字符在第一个串中的位置左边的就是左子树,右边的就是右子树。然后就是不停地递归建根、左子树、右子树。提交了两次,第一次结尾忘了输回车。。。
USER: Zhipeng ZHANG [138_3531]
TASK: heritage
LANG: C++
Compiling...
Compile: OK
Executing...
Test 1: TEST OK [0.011 secs, 3348 KB]
Test 2: TEST OK [0.011 secs, 3348 KB]
Test 3: TEST OK [0.000 secs, 3348 KB]
Test 4: TEST OK [0.011 secs, 3348 KB]
Test 5: TEST OK [0.000 secs, 3348 KB]
Test 6: TEST OK [0.011 secs, 3348 KB]
Test 7: TEST OK [0.000 secs, 3348 KB]
Test 8: TEST OK [0.000 secs, 3348 KB]
Test 9: TEST OK [0.011 secs, 3348 KB]
All tests OK.
Your program ('heritage') produced all correct answers! This is your submission #2 for this problem. Congratulations!
/* ID:138_3531 LANG:C++ TASK: heritage */ #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> #include <string> using namespace std; string s1,s2; int n; void work(string s1) { if (!s1.size()) return ; for (size_t i=0;i<s2.size();i++) if (s1.find(s2[i])!=-1) { int l=s1.size(); int p=s1.find(s2[i]); work(s1.substr(0,p)); //substr是生成从0位置开始,p长度的子串的函数 work(s1.substr(p+1,l-p-1)); cout<<s1[p]; break; } return ; } int main() { freopen("heritage.in","r",stdin); freopen("heritage.out","w",stdout); cin>>s1; cin>>s2; work(s1); cout<<endl; return 0; }
举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG