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

代码如下:

#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);     //输出该结点  
       }  
}  


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值