由前序中序遍历序列恢复二叉树,并按后序序列输出。前序中序序列存在s1,s2字符数组中,各字符代表节点且不相同:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct Tree
{
char date;
Tree *lchild;
Tree *rchild;
};
char s1[30],s2[30];
int len;
int value[260];
void v() //记录不同字符在s2中位置
{
for(int i=0;i<len;i++)
value[s2[i]]=i;
}
Tree *search(int left,int right) //查询子树的父节点并返回其指针
{
Tree *p;
p=NULL;
for(int i=0;i<len;i++)
if(value[s1[i]]>=left&&value[s1[i]]<=right)
{
p=(Tree *)malloc(sizeof(Tree));
p->date=s1[i];
break;
}
return p;
}
void creat(int left,int right,Tree *root) //恢复二叉树
{
int mid;
for(int i=0;i<len;i++)
if(s2[i]==root->date)
{
mid=i;
break;
}
if(mid-1>=left)
{
Tree *p1=search(left,mid-1);
root->lchild=p1;
creat(left,mid-1,p1);
}
else
root->lchild=NULL;
if(mid+1<=right)
{
Tree *p2=search(mid+1,right);
root->rchild=p2;
creat(mid+1,right,p2);
}
else
root->rchild=NULL;
}
void print(Tree *root) //按后序遍历序列输出
{
if(root->lchild!=NULL)
print(root->lchild);
if(root->rchild!=NULL)
print(root->rchild);
printf("%c",root->date);
}
int main()
{
while(scanf("%s%s",s1,s2)!=EOF)
{
len=strlen(s1);
memset(value,-1,sizeof(value));
v();
root=search(0,len-1);
creat(0,len-1,root);
print(root);
printf("\n");
}
}