您的位置:首页 > 其它

JZOJ1294.【USACO题库】3.4.2 American Heritage美国血统

2017-09-06 20:23 316 查看
题目描述

农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性

的”树的中序遍历“和”树的前序遍历“的符号加以记录而不是用图形的方法。

你的任务是在被给予奶牛家谱的”树中序遍历“和”树前序遍历“的符号后,创建奶牛家谱的”树的后序遍历“的符号。每一头奶牛的姓名被

译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多余26个的顶点。

这是在样例输入和样例输出中的树的图形表达方式:

C
/ \
B   G
/ \   \
A   D   H
/ \
E   F


树的中序遍历是打印左子树,根和右子树。

树的前序遍历是打印根,左子树和右子树。

树的后序遍历是打印左子树,右子树和根。

PROGRAM NAME: heritage

INPUT FORMAT

第一行: 树的中序遍历

第二行: 同样的树的前序遍历

SAMPLE INPUT (file heritage.in)

ABEDFCHG

CBADEFGH

OUTPUT FORMAT

单独的一行表示该树的后序遍历。

SAMPLE OUTPUT (file heritage.out)

AEFDBHGC

输入

输出

样例输入

样例输出

数据范围限制

思路:

一道遍历的题目,dfs即可

如何dfs这个东西?

这是中序ABEDFCHG(左根右)

这是前序CBADEFGH(根左右)

由前序第一个是C可知整棵树的根是C,在中序里标记一下

ABEDF(C)HG

现在,把根C和左右子树分开来了

前序第二个是B,说明C的左子树是B,标记一下

A[B]EDF(C)HG

这样就把B的左右子树又分开来了(左子树里面有A,右子树里面有E、D、F)

接着再到A,发现A没有子树了(l=r),输出A,回溯到B然后又dfs到D、E、F

把C的左子树遍历完以后,再遍历右子树,到了G、H同理

自此整棵树遍历完了,在dfs的末尾输出当前位置的字母

code:

var
s1,s2:string;
procedure dfs(l,r,root:longint);
var
x,y:longint;
begin
if l>r then exit;
x:=pos(s1[root],s2)+1;
y:=pos(s2[x],s1);
dfs(l,root-1,y);
x:=x+root-l;
y:=pos(s2[x],s1);
dfs(root+1,r,y);
write(s1[root]);
end;
begin
readln(s1);
readln(s2);
dfs(1,length(s1),pos(s2[1],s1));
writeln;
end.


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