先根后根不能唯一确定中根的情况:左子树或右子树为空。
相对于先根中根确定后根或者后根中根确定先根来说,注意长度为1的变化。
先上先根中根求后根的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void gettree(char* pre,char* in,char* post,int length)
{
int i;
if(length==0)
return;
for(i=0;i<length;i++)
if(in[i]==pre[0])
break;
post[length-1]=pre[0];
gettree(pre+1,in,post,i);
gettree(pre+i+1,in+i+1,post+i,length-i-1);
}
int main()
{
char tree[30];
char pre[30];
char in[30];
int len;
while(~scanf("%s%s",pre,in))
{
len=strlen(pre);
gettree(pre,in,tree,len);
tree[len]='\0';
printf("%s\n",tree);
}
return 0;
}
再上应该没有问题的先根后根求中根的代码= -
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getin(char* pre,char * post,char* in,int len)
{
int i;
if(len==0)
return 1;
if(len==1)
{
in[0]=pre[0];
return 1;
}
if(pre[0]!=post[len-1])
return 0;
for(i=0;i<len-1;i++)
{
if(post[i]==pre[1])
break;
}
if(i==len-2)
return 0;
in[i+1]=pre[0];
if(getin(pre+1,post,in,i+1))
return getin(pre+i+2,post+i+1,in+i+2,len-i-2);
else
return 0;
}
int main()
{
char post[30];
char pre[30];
char in[30];
int len;
while(~scanf("%s%s",pre,post))
{
len=strlen(pre);
if(!getin(pre,post,in,len))
printf("Impossible\n");
else
{
in[len]='\0';
printf("%s\n",in);
}
}
return 0;
}