博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1827 美国血统 American Heritage
阅读量:3960 次
发布时间:2019-05-24

本文共 1140 字,大约阅读时间需要 3 分钟。

题目描述:

农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线的”树的中序遍历“和”树的前序遍历“的符号加以记录而不是用图形的方法。

你的任务是在被给予奶牛家谱的”树中序遍历“和”树前序遍历“的符号后,创建奶牛家谱的”树的后序遍历“的符号。每一头奶牛的姓名译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多余26个的顶点。
这是在样例输入和样例输出中的树的图形表达式:

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

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

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

输入:

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

输出:

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

样例输入:

ABEDFCHGCBADEFGH

样例输出:

AEFDBHGC

解题思路:这个题主要考察的是二叉树递归求后序遍历。我们知道如果想要求出前序或者后序遍历都必须已知中序遍历,因为这样就可以知道前序或者后序在哪一边?如本题由前序确立根结点,然后由中序把根左右两边分开。

程序代码:

#include
#include
void build(int m,char s2[],char s1[]){
if(m<=0) return; int p=strchr(s1,s2[0])-s1;//找到根结点,在中序遍历的位置 build(p,s2+1,s1);//构造左子树的后序遍历 build(m-p-1,s2+p+1,s1+p+1);//构造右子树的后序遍历 printf("%c",s2[0]); }int main(){
int i,n,m,j,k; char s1[30],s2[30],t; while(scanf("%s%s",&s1,&s2)!=EOF) {
n=strlen(s1); m=strlen(s2); t=s2[0]; build(m,s2,s1); printf("\n"); } return 0;}

转载地址:http://texzi.baihongyu.com/

你可能感兴趣的文章
在Linux下安装MATLAB
查看>>
readme
查看>>
微服务概念
查看>>
数据库分库分表
查看>>
hibernate inverse 和cascade讲解
查看>>
建模工具Rose的学习
查看>>
javascript ajax提出异步请求
查看>>
Hibernate 中的 QBC
查看>>
解快局域网共享问题
查看>>
xp常用命令
查看>>
java 加密解密
查看>>
xp 忘记密码
查看>>
xp 忘记密码
查看>>
java 过滤器
查看>>
java 过滤器
查看>>
as发送邮件
查看>>
AJAX应用之注册用户即时检测
查看>>
File 类小结
查看>>
java除去字符串空格
查看>>
jsp 2.0标记文件
查看>>