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

来源:互联网 发布:2017淘宝双11红包雨 编辑:程序博客网 时间:2024/06/05 15:33

输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。

样例输入:

 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[n]='\0';        printf("%s\n",ans); //输出后序遍历    }    return 0;}


0 0
原创粉丝点击