先序序列:ABDEHJKLMNCFGI
中序序列:DBJHLKMNEAFCGI
后序序列:DJLNMKHEBFIGCA
#include <iostream>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
using namespace std;
typedef struct node
{
char data;
struct node* lchild;
struct node* rchild;
}BTNode;
//根据先序和后序的序列求二叉树
BTNode* CreaBT1(char *pre,char *in,int n) //pre表示前序序列,in表示中序序列
{
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(*pre==*p) //在in中找到根节点的位置
break;
k=p-in;
b->lchild=CreaBT1(pre+1,in,k); //处理左子树
b->rchild=CreaBT1(pre+k+1,p+1,n-k-1); //处理右子树
return b;
}
//根据中序和后序求二叉树
BTNode* CreaBT2(char *post,char *in,int n) //post表示后序序列,in表示中序列
{
BTNode *b;
char *p,r;
int k;
r=*(post+n-1);
if(n<=0)
return NULL;
b=(BTNode*)malloc(sizeof(BTNode));
b->data=r;
for(p=in;p<in+n;p++)
if(*p==r) //在in中找到根节点的位置
break;
k=p-in;
b->lchild=CreaBT2(post,in,k);
b->rchild=CreaBT2(post+k,p+1,n-k-1);
return b;
}
//输出二叉树
void DispBT(BTNode *b)
{
if(b!=NULL)
{
cout<<b->data;
if(b->lchild!=NULL||b->rchild!=NULL)
{
cout<<'(';
DispBT(b->lchild);
if(b->rchild!=NULL)
cout<<',';
DispBT(b->rchild);
cout<<')';
}
}
}
int main()
{
char s1[16],s2[16];
BTNode *b;
gets(s1);
gets(s2);
b=CreaBT1(s1,s2,strlen(s1));
DispBT(b);
cout<<endl;
gets(s1);
gets(s2);
b=CreaBT2(s1,s2,strlen(s1));
DispBT(b);
return 0;
}