题目描述
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果。
输入
输入数据占2行,其中第一行表示中序遍历结果,第二行为先序遍历结果。
输出
对测试数据,输出后序遍历结果。
样例输入
BFDAEGC
ABDFCEG
样例输出
FDBGECA
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MaxSize 1000
typedef struct Node
{
char data;
struct Node *lchild;
struct Node *rchild;
}BTnode;
BTnode *CreateBT1(char *pre,char *in,int n)
{
BTnode *b;
char *p;
int k;
if(n<=0) return NULL;//空字符串,退出
b=(BTnode*)malloc(sizeof(BTnode));
b->data=*pre;//取先序序列的值为结点值
for(p=in;p<in+n;p++)//在中序序列中找先序
{
if(*p==*pre)//找到后退出,p就是位置
{
break;
}
}
k=p-in;
//将总数据分为左右两部分,左边的为k个数据
//右边是n-k-1(此处1是查到的那个值,不算进来)
b->lchild=CreateBT1(pre+1,in,k);
//往左边部分数据创建(左部分数据又会再分为左右部分数据)
b->rchild=CreateBT1(pre+k+1,p+1,n-k-1);
//往右边部分数据创建(左部分数据又会再分为左右部分数据)
//参考教材229页
return b;
}
void PreOrder(BTnode*root)
{
if(root==NULL) return ;
PreOrder(root->lchild);
PreOrder(root->rchild);
printf("%c",root->data);
}
int main()
{
char pre[MaxSize];
char in[MaxSize];
scanf("%s",&in);
scanf("%s",&pre);
int n=strlen(in);//字符串长度为n
BTnode *root;//根节点
root=CreateBT1(pre,in,n);
//依据先序序列和中序序列创建二叉树
PreOrder(root);//后序遍历
}