1. 程式人生 > >資料結構——由中序與後序遍歷確定的二叉樹

資料結構——由中序與後序遍歷確定的二叉樹

由中序與後序遍歷確定的二叉樹

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define  MAXSIZE 50

typedef struct Node{        //二叉樹的鏈式儲存結點 
	char data;
	struct Node *Lchild;
	struct Node *Rchild;
}BiTNode,*BiTree;


void Visit(char data){
	printf("%c",data);
}

void PreOrder(BiTree T){      //先序遞迴遍歷
     if(T){
     	Visit(T->data);
     	PreOrder(T->Lchild);
     	PreOrder(T->Rchild);
	 } 	
}

void PostOrder(BiTree T){    //後序遞迴遍歷 
	if(T){
		PostOrder(T->Lchild);
		PostOrder(T->Rchild);
		Visit(T->data);
	}
}

void InOrder(BiTree T){      //中序遞迴遍歷 
	if(T){
		InOrder(T->Lchild);
		Visit(T->data);
		InOrder(T->Rchild);
	}
}
BiTree Construct(char *startIn,char *endIn,char *startPost,char *endPost){
	//後序遍歷的最後一個必然是根結點
	BiTree root=(BiTree)malloc(sizeof(BiTree));
	root->data=*endPost;
	root->Lchild=NULL;
	root->Rchild=NULL;
	
	
	//遞迴終止條件:後序遍歷中只有一個結點
	if(startPost==endPost) return root;
	
	//在中序遍歷中找到根結點
	char *rootIn=startIn;
	while(rootIn<=endIn&&(*rootIn)!=root->data)
		rootIn++;
		
	int leftlen=rootIn-startIn;//左子樹的結點數
	if(leftlen>0)//左子樹不為空,構造左子樹
		root->Lchild=Construct(startIn,rootIn-1,startPost,startPost+leftlen-1);
	int rightlen=endIn-rootIn;//右子樹的結點數
	if(rightlen>0)//右子樹不為空,構造右子樹
		root->Rchild=Construct(rootIn+1,endIn,startPost+leftlen,endPost-1);
	
	return root;
}


BiTree Create(char *in,char *post,int len){
	if(post==NULL || in==NULL || len<=0)   return NULL;
	
	return Construct(in,in+len-1,post,post+len-1); 
}


int main(){
	BiTree T;
	char Post[MAXSIZE],In[MAXSIZE];
	int n; 
	for(int i=0;i<MAXSIZE;i++){
		Post[i]='#';
		In[i]='#';
	}
	for(int j=0;j<MAXSIZE;j++){      //輸入中序序列 
		In[j]=getchar();
		if(In[j]=='\n'){
			In[j]='#';
			break;
		}	
	}
	for(int j=0;j<MAXSIZE;j++){       //輸入後序序列 
		Post[j]=getchar();
		if(Post[j]=='\n'){
			Post[j]='#';
			n=j;
			break;
		}
	}
	 
	char *post=Post;//先序序列
	char *in=In;//中序序列
	T=Create(in,post,n);
    

  	PreOrder(T); 
	
	return 0;
}