利用先序表和中序表,后序表和中序表建二叉树

利用先序表和中序表,后序表和中序表建二叉树,必须要好好理解
DLR 先序
LDR 中序
LRD 后序
深刻的含义,以及它们之间的联系,这个很重要!!!
说很难说清,直接代码记录吧

/*  小总结   利用后序表(LRD)找到根节点
****对比 中序表(LDR)找到对应的根节点 这样以此基础将中序表分为左右两部分 ,即左支树和右支树
*****而中序表中根节点的位置序号对应后序表中位置  又可以将后序表分为左支树 右支树俩部分
*****以此方法递归不断寻找构造
********************************************
*******************************************
******LRD:  D G E B F C A
******LDR:  D B E G A F C
稍微表示一下变化顺序 叶节点就省略了(反正我能看懂)

             DGEB   FCa
			 DBEG   aFC


             D   GEb   Fca
			 D   bEG   aFc

              
		     d   Geb    Fca
			 d   G e g  Fca

因为先写的后序中序建表,就以此为例简述原理
先序中序原理一样         
*/
#include<stdio.h>
#include<stdlib.h>

typedef struct node{
	char data;
	struct node *LC;
	struct node *RC;
}BNode;

//中序后序建二叉树
BNode *PMCreatBTree(char *post,char *in,int n){  //post 放后序LDR  in放中序
	BNode *b;
	char root,*p;
	int k;
	if(n<=0){
		return NULL;
	}
	root=*(post+n-1);  //找根节点
	b=(BNode *)malloc(sizeof(BNode));
	b->data=root;
	for(p=in;p<in+n;p++){
		if(*p==root)
			break;
	}
	k=p-in;//定位
	b->LC=PMCreatBTree(post,in,k);
	b->RC=PMCreatBTree(post+k,p+1,n-k-1);      //右支树的递归建立

	return b;
}

//前序中序建二叉树
BNode *PrInCreatBTree(char *pre,char *in,int n){
	BNode *c;
	char *p;
	int k;
	if(n<=0)
		return NULL;
	c=(BNode *)malloc(sizeof(BNode));
	c->data= *pre;
	for(p=in;p<in+n;p++){
		if(*p==*pre)
			break;
	}
	k=p-in;
	c->LC=PrInCreatBTree(pre+1,in,k);
	c->RC=PrInCreatBTree(pre+k+1,p+1,n-k-1);

	return c;


}

//前序遍历
void ShowPre(BNode *b){
	if(b){
		printf("%c",b->data);
		ShowPre(b->LC);
		ShowPre(b->RC);
	}
}

//中序遍历
void ShowIn(BNode *b){
	if(b){
		ShowIn(b->LC);
		printf("%c",b->data);
		ShowIn(b->RC);
	}
	
}

//后序遍历
void ShowPost(BNode *b){
	if(b){
		ShowPost(b->LC);
		ShowPost(b->RC);
		printf("%c",b->data);
	}
	
}

int main(){
	int n;
	BNode *b=NULL;
	BNode *c=NULL;
	char pre[]="ABDEGCF";
	char in[]="DBEGAFC";
	char post[]="DGEBFCA";

	n=sizeof(post)/sizeof(char)-1;

	b=PMCreatBTree(post,in,n);
	c=PrInCreatBTree(pre,in,n);

	printf("前序中序建表验证:\n");
	printf("\n前序遍历结果为:\n");
	ShowPre(c);
	printf("\n");
	printf("中序遍历结果为:\n");
	ShowIn(c);
	printf("\n");
	printf("后序遍历结果为:\n");
	ShowPost(c);

	printf("\n\n*******************************\n\n");

	printf("后序中序建表验证:\n");
	printf("\n前序遍历结果为:\n");
	ShowPre(b);
	printf("\n");
	printf("中序遍历结果为:\n");
	ShowIn(b);
	printf("\n");
	printf("后序遍历结果为:\n");
	ShowPost(b);
	printf("\n");
	return 0;
}



这里就不手动输入数据了,都是一样的
测试结果:
利用先序表和中序表,后序表和中序表建二叉树