#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define maxsize 50
typedef struct Bnode
{
char data;
struct Bnode *Lchild, *Rchild;
}BTnode, *BTptr;
BTptr CreateBT(char *pre_str, char *in_str)
{
BTptr bt;
bt=(BTptr)malloc(sizeof(BTnode));
bt->data=pre_str[0];
bt->Lchild=NULL;
bt->Rchild=NULL;
if(strlen(pre_str)==1)
return bt;
else
{
char pre_left[maxsize];
char in_left[maxsize];
char pre_right[maxsize];
char in_right[maxsize];
int i=0, j=0;
while(in_str[i]!=bt->data)
{
pre_left[i]=pre_str[i+1];
in_left[i]=in_str[i];
i++;
}
pre_left[i]='\0';
in_left[i]='\0';
while(i<=strlen(in_str))
{
pre_right[j]=pre_str[i];
in_right[j]=in_str[i+1];
i++;j++;
}
pre_right[j]='\0';
in_right[j]='\0';
if(strlen(pre_left)!=strlen(in_left) || strlen(pre_right)!=strlen(in_right))
{
printf("Error\n");
return 0;
}
bt->Lchild=CreateBT(pre_left, in_left);
bt->Rchild=CreateBT(pre_right, in_right);
return bt;
}
}
BTptr Judge(char *pre_str, char *in_str)
{
if(pre_str==NULL || in_str==NULL || strlen(pre_str)!=strlen(in_str))
return 0;
else
return CreateBT(pre_str, in_str);
}
void PreExchange(BTptr T)
{
BTptr p;
if(T!=NULL)
{
p=T->Lchild;
T->Lchild=T->Rchild;
T->Rchild=p;
PreExchange(T->Lchild);
PreExchange(T->Rchild);
}
}
void PostOrderBT(BTptr T)
{
if(T!=NULL)
{
PostOrderBT(T->Lchild);
PostOrderBT(T->Rchild);
printf("%c",T->data);
}
}
void main()
{
char pre_str[maxsize];
char in_str[maxsize];
gets(pre_str);
gets(in_str);
BTptr bt;
bt=Judge(pre_str, in_str);
PostOrderBT(bt);
printf("\n");
PreExchange(bt);
PostOrderBT(bt);
}
改好了:
#include
#include
#include
#define maxsize 50
typedef struct Bnode
{
char data;
struct Bnode *Lchild, *Rchild;
}BTnode, *BTptr;
BTptr CreateBT(char *pre_str, char *in_str)
{
BTptr bt;
bt=(BTptr)malloc(sizeof(BTnode));
bt->data=pre_str[0];
bt->Lchild=NULL;
bt->Rchild=NULL;
if(strlen(pre_str)==0)
return bt;
if(strlen(pre_str)==1)
return bt;
else
{
char pre_left[maxsize];
char in_left[maxsize];
char pre_right[maxsize];
char in_right[maxsize];
int i=0, j=0;
while(in_str[i]!=bt->data)
{
pre_left[i]=pre_str[i+1];
in_left[i]=in_str[i];
i++;
}
pre_left[i]='\0';
in_left[i]='\0';
while(i<(int)strlen(in_str))//动了下
{
pre_right[j]=pre_str[i+1];//[i]改为[i+1]
in_right[j]=in_str[i+1];
i++;j++;
}
pre_right[j]='\0';
in_right[j]='\0';
if(strlen(pre_left)!=strlen(in_left) || strlen(pre_right)!=strlen(in_right))
{
printf("Error\n");
return 0;
}
bt->Lchild=CreateBT(pre_left, in_left);
bt->Rchild=CreateBT(pre_right, in_right);
return bt;
}
}
BTptr Judge(char *pre_str, char *in_str)
{
if(pre_str==NULL || in_str==NULL || strlen(pre_str)!=strlen(in_str))
return 0;
else
return CreateBT(pre_str, in_str);
}
void PreExchange(BTptr T)
{
BTptr p;
if(T!=NULL)
{
p=T->Lchild;
T->Lchild=T->Rchild;
T->Rchild=p;
PreExchange(T->Lchild);
PreExchange(T->Rchild);
}
}
void PostOrderBT(BTptr T)
{
if(T!=NULL)
{
PostOrderBT(T->Lchild);
PostOrderBT(T->Rchild);
printf("%c",T->data);
}
}
void main()
{
char pre_str[maxsize];
char in_str[maxsize];
gets(pre_str);
gets(in_str);
BTptr bt;
bt=Judge(pre_str, in_str);
PostOrderBT(bt);
printf("\n");
PreExchange(bt);
PostOrderBT(bt);
}