【USACO题库】3.4.2 American Heritage美国血统
2016-12-16 20:37
369 查看
题目描述
农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性的”树的中序遍历“和”树的前序遍历“的符号加以记录而不是用图形的方法。
你的任务是在被给予奶牛家谱的”树中序遍历“和”树前序遍历“的符号后,创建奶牛家谱的”树的后序遍历“的符号。每一头奶牛的姓名被
译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多余26个的顶点。
这是在样例输入和样例输出中的树的图形表达方式:
C / \ / \ B G / \ / A D H / \ E F
树的中序遍历是打印左子树,根和右子树。
树的前序遍历是打印根,左子树和右子树。
树的后序遍历是打印左子树,右子树和根。
INPUT FORMAT
第一行: | 树的中序遍历 |
第二行: | 同样的树的前序遍历 |
SAMPLE INPUT (file heritage.in)
ABEDFCHGCBADEFGH
OUTPUT FORMAT
单独的一行表示该树的后序遍历。SAMPLE OUTPUT (file heritage.out)
AEFDBHGC
解题思路:
题目大意:就是给定你一棵唯一的树他的前序和中序遍历,求出后序遍历。
又是一道遍历的题目。
题目给定我们一个中序遍历,就是告诉我们每一个的根是什么。
用样例来说:
ABEDFCHG 左根右
CBADEFGH 根左右
通过前序遍历发现,整棵树的根就是C了。
那么根据C来分s1:
分成了ABEDF左子树,C根,HG右子树。
又根据s1的分法,分s2:
C是必定分离的了,因为上面的左子树为5个长度,那么我们这里也应为5个长度,左子树为BADEF,右子树为GH。
重复以前,根据s2是根左右,确定左子树的根又为B,右子树的根又为G,继续细分,递归实现。
但是怎么输出呢?
因为我们的递归正好是后序遍历,所以找到一个根输出即可,具体请看代码注释:
var s,s1:string; procedure dg(x,root,y:longint);//x,y表示在第x~y的子树中,根的位置为root的一次递归 var i,w,p:longint; begin if x>y then exit; p:=pos(s[root],s1)+1;//这个就是用来寻找当前的根在中序的哪个地方,又下一个为左子树,又是左子树的根,所以这样。 w:=pos(s1[p],s);//寻找那个根在前序中的位置。 dg(x,w,root-1);//递归,在x~root-1的位置 p:=p+root-x;//这个是考虑长度的问题,找到右子树及它的根。 w:=pos(s1[p],s); dg(root+1,w,y); write(s[root]); end; begin readln(s); readln(s1); dg(1,pos(s1[1],s),length(s)); end.
相关文章推荐
- 【USACO题库】3.4.2 American Heritage美国血统
- JZOJ1294.【USACO题库】3.4.2 American Heritage美国血统
- USACO 3.4 American Heritage美国血统 (树的遍历)
- USACO3.4.2--American Heritage
- USACO Training 3.4.2 American Heritage 题解与分析
- American Heritage美国血统
- 【USACO3.4.2】美国血统
- USACO / American Heritage (经典递归入门)
- 【洛谷P1827】【USACO】 美国血统 American Heritage 由二叉树两个序列求第三个序列
- 【洛谷P1827】【USACO】 美国血统 American Heritage 由二叉树两个序列求第三个序列
- USACO American Heritage
- usaco3.4.3美国血统
- USACO 3.4 American Heritage
- USACO/heritage 3.4.2 前序 中序 后序
- usaco3.4.1 American Heritage
- USACO 3.4.3 American Heritage
- usaco American Heritage
- USACO 3.4 American Heritage
- American Heritage usaco
- usaco American Heritage