USACO 3.4 美国血统

本文介绍了一个算法问题,即如何通过给定的树的中序和前序遍历来构建树的后序遍历。这是一个经典的二叉树遍历问题,涉及到递归算法的应用。文中提供了一个具体的示例和相应的程序实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

  农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线性的“树的中序遍历”和“树的前序遍历”的符号加以记录而不是用图形的方法。 
  你的任务是在被给予奶牛家谱的“树中序遍历”和“树前序遍历”的符号后,创建奶牛家谱的“树的后序遍历”的符号。每一头奶牛的姓名被译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多余26个的顶点。这是在样例输入和样例输出中的树的图形表达方式: 

/ \ 
/ \ 
B G 
/ \ / 
A D H 
/ \ 
E F 
  树的中序遍历是打印左子树,根和右子树。 
  树的前序遍历是打印根,左子树和右子树。 
  树的后序遍历是打印左子树,右子树和根。 

Input

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

Output

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

Sample Input

 

ABEDFCHG 
CBADEFGH

 

Sample Output

 

AEFDBHGC


解题思路:先读入前序和中序遍历,然后用递归,先求l1的第一个字符再l2中的位置,然后遍历第m个的左半边,再遍历m的右半边,最后输出即可。


程序:
var
  s1,s2:string;

procedure try(l1,r1,l2,r2:longint);
  var
    m:longint;
  begin
    m:=pos(s1[l1],s2);
    if m>l2 then try(l1+1,l1+m-l2,l2,m-1);
    if m
    write(s1[l1]);
end;

begin
  readln(s2);
  readln(s1);
  try(1,length(s1),1,length(s2));
  writeln;
end.


版权属于: Chris
原文地址: http://blog.sina.com.cn/s/blog_83ac6af80102v0oq.html
转载时必须以链接形式注明原始出处及本声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值