由中序与后序遍历确定的二叉树
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 50
typedef struct Node{ //二叉树的链式存储结点
char data;
struct Node *Lchild;
struct Node *Rchild;
}BiTNode,*BiTree;
void Visit(char data){
printf("%c",data);
}
void PreOrder(BiTree T){ //先序递归遍历
if(T){
Visit(T->data);
PreOrder(T->Lchild);
PreOrder(T->Rchild);
}
}
void PostOrder(BiTree T){ //后序递归遍历
if(T){
PostOrder(T->Lchild);
PostOrder(T->Rchild);
Visit(T->data);
}
}
void InOrder(BiTree T){ //中序递归遍历
if(T){
InOrder(T->Lchild);
Visit(T->data);
InOrder(T->Rchild);
}
}
BiTree Construct(char *startIn,char *endIn,char *startPost,char *endPost){
//后序遍历的最后一个必然是根结点
BiTree root=(BiTree)malloc(sizeof(BiTree));
root->data=*endPost;
root->Lchild=NULL;
root->Rchild=NULL;
//递归终止条件:后序遍历中只有一个结点
if(startPost==endPost) return root;
//在中序遍历中找到根结点
char *rootIn=startIn;
while(rootIn<=endIn&&(*rootIn)!=root->data)
rootIn++;
int leftlen=rootIn-startIn;//左子树的结点数
if(leftlen>0)//左子树不为空,构造左子树
root->Lchild=Construct(startIn,rootIn-1,startPost,startPost+leftlen-1);
int rightlen=endIn-rootIn;//右子树的结点数
if(rightlen>0)//右子树不为空,构造右子树
root->Rchild=Construct(rootIn+1,endIn,startPost+leftlen,endPost-1);
return root;
}
BiTree Create(char *in,char *post,int len){
if(post==NULL || in==NULL || len<=0) return NULL;
return Construct(in,in+len-1,post,post+len-1);
}
int main(){
BiTree T;
char Post[MAXSIZE],In[MAXSIZE];
int n;
for(int i=0;i<MAXSIZE;i++){
Post[i]='#';
In[i]='#';
}
for(int j=0;j<MAXSIZE;j++){ //输入中序序列
In[j]=getchar();
if(In[j]=='\n'){
In[j]='#';
break;
}
}
for(int j=0;j<MAXSIZE;j++){ //输入后序序列
Post[j]=getchar();
if(Post[j]=='\n'){
Post[j]='#';
n=j;
break;
}
}
char *post=Post;//先序序列
char *in=In;//中序序列
T=Create(in,post,n);
PreOrder(T);
return 0;
}