您的位置:首页 > 其它

【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)

ABEDFCHG

CBADEFGH


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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: