先序遍歷+中序遍歷->二叉樹 & 中序遍歷+後續遍歷->二叉樹

#include"btree.cpp"文件鏈接:https://blog.csdn.net/qq_16261421/article/details/105920539

由先序遍歷和中序遍歷可以唯一的確定一顆二叉樹,使用遞歸的方法創建。

由後續遍歷和中序遍歷可以唯一的確定一顆二叉樹,使用遞歸的方法創建。

但是:先序遍歷和後續遍歷不能唯一的創建一顆二叉樹。

#include "btree.cpp"

/*pre存放先序序列,in存放中序序列,n爲二叉樹結點個數,
本算法執行後返回構造的二叉鏈的根結點指針*/
BTNode *CreateBT1(char *pre,char *in,int n){
	BTNode *s;
	char *p;
	int k;
	if (n<=0){
		return NULL;
	} 
	s=(BTNode *)malloc(sizeof(BTNode));		//創建二叉樹結點*s
	s->data=*pre;
	//在中序序列中找等於*ppos的位置k
	for (p=in;p<in+n;p++){
		//pre指向根結點
		if (*p==*pre){
			break;							//在in中找到後退出循環
		}						
	}				
	k=p-in;									//確定根結點在in中的位置
	s->lchild=CreateBT1(pre+1,in,k);		//遞歸構造左子樹
	s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //遞歸構造右子樹
	return s;
}

/*post存放後序序列,in存放中序序列,n爲二叉樹結點個數,
本算法執行後返回構造的二叉鏈的根結點指針*/
BTNode *CreateBT2(char *post,char *in,int n){
	BTNode *s;
	char r,*p;
	int k;
	if (n<=0){
		return NULL;
	} 
	r=*(post+n-1);							//根結點值
	s=(BTNode *)malloc(sizeof(BTNode));		//創建二叉樹結點*s
	s->data=r;
	//在in中查找根結點
	for (p=in;p<in+n;p++){
		if (*p==r){
			break;		
		}
	}				
	k=p-in;									//k爲根結點在in中的下標
	s->lchild=CreateBT2(post,in,k);			//遞歸構造左子樹
	s->rchild=CreateBT2(post+k,p+1,n-k-1);	//遞歸構造右子樹
	return s;
}

int main()
{
	T pre[]="ABDGCEF",in[]="DGBAECF",post[]="GDBEFCA";
	BTNode *b1,*b2;
	b1=CreateBT1(pre,in,7);
	printf("b1:");
	DispBTNode(b1);
	printf("\n");
	b2=CreateBT2(post,in,7);
	printf("b2:");
	DispBTNode(b2);
	printf("\n");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章