已知先序+中序构造二叉树,已知后序+中序构造二叉树(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); //输出该结点
}
}
#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); //输出该结点
}
}
相关文章推荐
- 已知中序与后序,或者中序与先序,构造二叉树
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现
- 已知前序、中序,递归建立二叉树(C语言)
- 已知中序与后序,或者中序与先序,构造二叉树
- 【工程】二叉树已知前序/中序的顺序,构造树的递归等实现
- 已知中序与后序,或者中序与先序,构造二叉树
- 已知二叉树的中序序列和前序序列(或后序)求解树
- 二叉树已知先序序列(后序序列)、中序序列求解后序序列(先序序列)
- 用c语言创建一颗二叉树,用递归方法实现对其进行先序、中序和后序遍历的操作。
- C语言构造并非递归遍历二叉树
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 已知二叉树的先序遍历和中序遍历序列求后序遍历序列
- 已知一棵二叉树的后序遍历和中序遍历,写出可以确定这棵二叉树的算法
- 已知中序后序创建二叉树
- 前序遍历和中序遍历树构造二叉树-LintCode
- C++ 根据前序遍历序列和中序遍历序列可以构造唯一的二叉树
- 已知二叉树的先序和中序求后序和已知中序和后序求前序
- 关于二叉树的问题1-已知前序,中序求后序遍历
- c语言实现二叉树的建立与前序、中序、后序、层序遍历
- 二叉树已知先序&中序求后序