1. 程式人生 > >已知先序+中序構造二叉樹,已知後序+中序構造二叉樹(C語言)

已知先序+中序構造二叉樹,已知後序+中序構造二叉樹(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);     //輸出該結點  
       }  
}