USACO-Section 3.4 American Heritage (分治)
2016-04-10 21:31
423 查看
描述
农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而不是用图形的方法。你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多于26个的顶点。 这是在样例输入和样例输出中的树的图形表达方式:
C / \ / \ B G / \ / A D H / \ E F
树的中序遍历是按照左子树,根,右子树的顺序访问节点。
树的前序遍历是按照根,左子树,右子树的顺序访问节点。
树的后序遍历是按照左子树,右子树,根的顺序访问节点。
格式
PROGRAM NAME: heritageINPUT FORMAT:
(file heritage.in)
第一行: 树的中序遍历
第二行: 同样的树的前序遍历
OUTPUT FORMAT:
(file heritage.out)
单独的一行表示该树的后序遍历。
SAMPLE INPUT
ABEDFCHG CBADEFGH
SAMPLE OUTPUT
AEFDBHGC
很简单的题,取先序的第一个节点为根,可以将先序序列和中序序列分为2部分(或1部分),递归调用,知道当前区间只有一个节点
直接实现了建树的代码,可以直接在返回值部分输出当前节点的值
代码:
/* ID: your_id_here PROG: heritage LANG: C++ */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN=105; int n,cnt=1,root; char inod[27],preod[27]; struct Node { int lson,rson; char c; }tr[27]; int dfs(int pl,int pr,int il,int ir) { if(pl==pr) { tr[cnt].lson=tr[cnt].rson=-1; tr[cnt].c=preod[pl]; return cnt++; } for(int i=il;i<=ir;++i) { if(preod[pl]==inod[i]) { int cur=cnt++; tr[cur].lson=tr[cur].rson=-1; tr[cur].c=preod[pl]; if(il<i) tr[cur].lson=dfs(pl+1,pl+i-il,il,i-1); if(i<ir) tr[cur].rson=dfs(pl+i-il+1,pr,i+1,ir); return cur; } } return cnt; } void print(int i) { if(i==-1) return ; print(tr[i].lson); print(tr[i].rson); printf("%c",tr[i].c); } int main() { freopen("heritage.in","r",stdin); freopen("heritage.out","w",stdout); scanf("%s%s",inod,preod); n=strlen(inod); cnt=0; print(dfs(0,n-1,0,n-1)); printf("\n"); return 0; }
相关文章推荐
- 异常处理
- Linux 系统链接装载可执行程序
- Program2_1004
- 懂二进制(16年小米校招)
- eth0,eth0: ERROR while getting interface flags: No such device
- 对各种排序的分析和实现
- iOS开发68-iOS 如何让UIScrollView在手指离开后立即停止滑动
- 我的Python编程体验总结
- 设计模式-2-观察者模式(2)
- Atiti。流量提升软件设计大纲规划 v1 q45
- 一周乱弹(eclipse git重复输入密码、jQuery自动补全)
- 20160410servlet学习笔记网站访问次数计数器
- 程序设计中利用“按位异或”运算交换两个变量的值原理
- init进程
- 第6周学习总结
- Atiti。流量提升软件设计大纲规划 v1 q45
- Atiti。流量提升软件设计大纲规划 v1 q45
- 20145235 《Java程序设计》第6周学习总结
- 使用反射和codeDom实现C#插件开发(3)主程序开发之动态类
- acmcoder汉字统计