#include<stdio.h>
#include<stdlib.h>
typedef struct Bitree{
char data;
struct Bitree *lchild;
struct Bitree *rchild;
}Bitree,*Bi;
void PreOrder(Bitree *p);
void MidOrder(Bitree *p);
void PostOrder(Bitree *p);
void print(Bitree *Troot);
void midprecreat(Bi &Node,char mid[],char pre[],int lm,int rm,int lp,int rp)
{//中序加先序创建
Node=(Bi)malloc(sizeof(Bitree));
Node->data=pre[lp];
Node->lchild=NULL;
Node->rchild=NULL;
int pos=lm;
while(mid[pos]!=pre[lp])
pos++;
int childlen=pos-lm;//用来控制子树在字符串中的范围
if(pos>lm)//有左子树,递归创建
midprecreat(Node->lchild,mid,pre,lm,pos-1,lp+1,lp+childlen);
if(pos<rm)//有右子树,递创建
midprecreat(Node->rchild,mid,pre,pos+1,rm,lp+childlen+1,rp);
}
void midpostcreat(Bi &Node,char mid[],char post[],int lm,int rm,int lp,int rp)
{//中序+后序创建
Node=(Bi)malloc(sizeof(Bitree));
Node->data=post[rp];
Node->lchild=NULL;
Node->rchild=NULL;
int pos=lm;
while(mid[pos]!=post[rp])
pos++;
int childlen=pos-lm;//用来控制子树在字符串中的范围
if(pos>lm)//有左子树,递归创建
midpostcreat(Node->lchild,mid,post,lm,pos-1,lp,lp+childlen-1);
if(pos<rm)//有右子树,递创建
midpostcreat(Node->rchild,mid,post,pos+1,rm,lp+childlen,rp-1);
}
int main()
{
char pre[100]; //存储先序序列
char mid[100]; //存储中序序列
char post[100]; //存储后序序列
int n;
Bitree *Troot;
printf("程序1请输入节点个数\n");
scanf("%d",&n); getchar();
printf("输入二叉树的中序与先序序列,求后序序列\n");
gets(mid);
gets(pre);
midprecreat(Troot,mid,pre,0,n-1,0,n-1);
print(Troot);
printf("程序2 请输入节点个数\n");
scanf("%d",&n); getchar();
printf("输入二叉树的中序与后序序列,求先序序列\n");
gets(mid);
gets(post);
midpostcreat(Troot,mid,post,0,n-1,0,n-1);
print(Troot);
return 0;
}
void print(Bitree *Troot)
{
printf("先序遍历结果:\n");
PreOrder(Troot);
printf("\n");
printf("中序遍历结果:\n");
MidOrder(Troot);
printf("\n");
printf("后序遍历结果:\n");
PostOrder(Troot);
printf("\n");
}
//先序遍历
void PreOrder(Bitree *p)
{
if(p != NULL)
{
printf("%c ",p->data); //输出该结点
PreOrder(p->lchild); //遍历左子树
PreOrder(p->rchild); //遍历右子树
}
}
//中序遍历
void MidOrder(Bitree *p)
{
if(p != NULL)
{
MidOrder(p->lchild); //遍历左子树
printf("%c ",p->data); //输出该结点
MidOrder(p->rchild); //遍历右子树
}
}
//后序遍历
void PostOrder(Bitree *p)
{
if(p != NULL)
{
PostOrder(p->lchild); //遍历左子树
PostOrder(p->rchild); //遍历右子树
printf("%c ",p->data); //输出该结点
}
}
已知先序+中序构造二叉树,已知后序+中序构造二叉树
最新推荐文章于 2023-01-11 09:41:43 发布