题目描述:
农夫约翰非常认真地对待他的奶牛们的血统。然而他不是一个真正优秀的记帐员。他把他的奶牛们的家谱作成二叉树,并且把二叉树以更线的”树的中序遍历“和”树的前序遍历“的符号加以记录而不是用图形的方法。
你的任务是在被给予奶牛家谱的”树中序遍历“和”树前序遍历“的符号后,创建奶牛家谱的”树的后序遍历“的符号。每一头奶牛的姓名译为一个唯一的字母。(你可能已经知道你可以在知道树的两种遍历以后可以经常地重建这棵树。)显然,这里的树不会有多余26个的顶点。
这是在样例输入和样例输出中的树的图形表达式:
C
/ \
/ \
B G
/ \ /
A D H
/ \
E F
树的中序遍历是打印左子树,根和右子树。
树的前序遍历是打印根,左子树和右子树。
树的后序遍历是打印左子树,右子树和根。 13
输入:
第一行: 树的中序遍历
第二行: 同样的树的前序遍历
输出:
单独的一行表示该树的后序遍历
样例输入:
ABEDFCHG
CBADEFGH
样例输出:
AEFDBHGC
解题思路:这个题主要考察的是二叉树递归求后序遍历。我们知道如果想要求出前序或者后序遍历都必须已知中序遍历,因为这样就可以知道前序或者后序在哪一边?如本题由前序确立根结点,然后由中序把根左右两边分开。
程序代码:
#include<stdio.h>
#include<string.h>
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;
}