分析:
这道题的基础是要知道手写后序和中序,求前序。
与知道先序和中序求后序的相同点,都是在中序中找到一个点,以此分割左右子树。
不同点为,先序的第一个字符必定是根,后序最后一个字符才是根。
所以这道题要从后序的最后一个字符开始分割左右子树。
#include<stdio.h>
#include<string.h>
struct tree
{
char data;
int r;
int l;
}trees[30];
struct tree node[30];
char prep[30];
char mid[30];
int num;
int find(int begin,int end)
{
//printf("%d %d",begin,end);
if(begin>end) return -1;
int i;
num--;
//printf("%d %c ",num,prep[num]);
for(i=begin;i<=end;i++)
{
if(prep[num]==mid[i]) break;
}
if(i>end) return -1;
node[i].data=prep[num];
node[i].r=find(i+1,end);
node[i].l=find(begin,i-1);
//printf("data=%c l=%d r=%d\n",node[i].data,node[i].l,node[i].r);
return i;
}
void goafter(int now)
{
if(now==-1) return;
printf("%c",node[now].data);
goafter(node[now].l);
goafter(node[now].r);
}
main()
{
scanf("%s%s",mid,prep);
num=strlen(prep);
int root = find(0,strlen(prep)-1);
//printf("data=%c l=%d r=%d\n",node[root].data,node[root].l,node[root].r);
//printf("data=%c l=%d r=%d\n",node[node[root].l].data,node[node[root].l].l,node[node[root].l].r);
goafter(root);
}