您的位置:首页 > 编程语言 > C语言/C++

已知先序+中序构造二叉树,已知后序+中序构造二叉树(C语言)

2016-12-29 21:21 706 查看
代码如下:

#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); //输出该结点
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息