您的位置:首页 > 其它

算法竞赛入门经典 第六章 二叉树重建

2014-06-07 16:28 232 查看
输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。

样例输入:

DBACEGF ABCDEFG

BCAD CBAD

样例输出 :

ACBFGED

CDAB

*p=strchr(s2,s1[0]); *p里边存的是在s2中第一次出现s1[0]的位置开始一直到s2字符串结束,

p=strchr(s2,s1[0])-s2; p里边存的是s1[0]在s2中的位置,是一个数。

#include <stdio.h>
#include <string.h>
char s1[20],s2[20],ans[20];

void build(int n,char* s1,char*s2,char *s)
{
if(n<=0) return ;
int p=strchr(s2,s1[0])-s2; //找到根结点在s2中的位置
build(p,s1+1,s2,s);  //建立左子树的后序遍历
build(n-p-1,s1+p+1,s2+p+1,s+p);//建立右子树的后序遍历
s[n-1]=s1[0];//在最后的位置将根结点插入
}//整个遍历之后,一次递归将当前的根结点放在最后,递归完毕,后序遍历也就出来了。

int main (void)
{
int n,i;
while(scanf("%s%s",s1,s2)!=EOF)  //s1表示先序遍历,s2代表中序遍历
{
n=strlen(s1);
build(n,s1,s2,ans);  //构造后序遍历
ans
='\0';
printf("%s\n",ans); //输出后序遍历
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: