先序序列和中序序列構造二叉樹,中序序列和後序序列構造二叉樹

1:首先讀者要了解二叉樹BinaryTree基本概念,其次區分左子樹與左孩子節點,右子樹與右孩子節點。(在數據結構中      一個節點可以成爲一棵樹,對於沒有孩子節點的節點稱爲爲葉子節點)。

2:在讀這篇博文之前,讀者腦海中應該有這樣一個模型(看圖)


整棵二叉樹根節點爲A,A的左孩子爲B,A的左子樹由B、D、G 3個節點構成,A的右孩子爲C,A的右子樹由C、E、F 3個節點構成;

B節點(樹,對於D、G來說,它就是D、G的根節點),A的左孩子爲D,A的左子樹右D、G構成,B沒有右孩子和右子樹

D節點(樹,對於G來說,它就是G的根節點)D沒有左孩子和左子樹,D的右孩子爲G,D的右子樹由D構成

G節點(葉子節點,個人觀點葉子節點可以稱爲樹

(C、E、F讀者可自行分析)

先序序列和中序序列構造二叉樹:


圖解:



上代碼:

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

typedef char ElementType ;

typedef struct node
{
	ElementType data ;
	struct node * leftChild ;
	struct node * rightChild ;
}BTNode;

//pre:存放先序序列  in:存放中序序列
BTNode *createBT(char *pre , char *in ,int n)
{
	BTNode *b;
	char *p ;
	int k ;
	if(n<=0)
		return NULL;
	b=(BTNode *)malloc(sizeof(BTNode));
	b->data = *pre ;
	int j=0;
	for(p=in;p<in+n;p++)
	{
		if(*p == *pre)
			break;
	}
	k=p-in;           //確定根節點在中序序列(in)中的位置 編號爲0,1,2,...,n-1 (類似於數組中的下標號,不是邏輯序號)
	b->leftChild = createBT(pre+1,in,k);   //遞歸構造左子數
	b->rightChild = createBT(pre+1+k,p+1,n-k-1);  //遞歸構造右子樹
	return b ;
}

//先序遍歷二叉樹BinaryTree:先遍歷根節點接着遍歷左子樹,最後遍歷右子樹
//(不是左孩子節點和右孩子節點,概念要分清哦(雖然節點也是一個樹))
void showBTPreOrder(BTNode *b)
{
	if(b != NULL)
	{
		//遍歷根節點
		printf("%c",b->data);
		//遍歷左子樹
		showBTPreOrder(b->leftChild);
		//遍歷右子樹
		showBTPreOrder(b->rightChild);

	}
}

//中序遍歷二叉樹BinaryTree:先遍歷左子樹,接着遍歷根節點,左後遍歷右子樹
//(不是左孩子節點和右孩子節點,概念要分清哦(雖然節點也是一個樹))
void showBTInOrder(BTNode *b)
{
	if(b!=NULL)
	{
		//遍歷左子樹
		showBTInOrder(b->leftChild);
		//遍歷根節點
		printf("%c",b->data);
		//遍歷右子樹
		showBTInOrder(b->rightChild);
	}
}

int main()
{
	BTNode *b = NULL ;
	char pre[] = "ABDGCEF";
	char in[] = "DGBAECF" ;
	b=createBT(pre,in,7);
	//先序遍歷遍歷二叉樹
	printf("先序遍歷遍歷二叉樹:\n");
	showBTPreOrder(b);
	printf("\n");
	//中序遍歷遍歷二叉樹
	printf("中序遍歷遍歷二叉樹:\n");
	showBTInOrder(b);
	printf("\n");
	return 0 ;
}

程序運行結果:

先序遍歷遍歷二叉樹:
ABDGCEF
中序遍歷遍歷二叉樹:
DGBAECF

Press any key to continue


後序序列和中序序列構造二叉樹:


圖解:



上代碼:

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

typedef char ElementType ;

typedef struct node
{
	ElementType data ;
	struct node * leftChild ;
	struct node * rightChild ;
}BTNode;

//post:存放後序序列  in:存放中序序列
BTNode *createBT(char *post , char *in ,int n)
{
	BTNode *b;
	char *p ,root ;  //root:根節點值
	int k ;
	if(n<=0)
		return NULL;
	root=*(post+n-1) ;  //獲取根節點的值
	b=(BTNode *)malloc(sizeof(BTNode));
	b->data = root ;
	for(p=in;p<in+n;p++)
	{
		if(*p == root)
			break;
	}
	k=p-in;           //確定根節點在中序序列(in)中的位置(下標號) 編號爲0,1,2,...,n-1 (類似於數組中的下標號,不是邏輯序號)
	b->leftChild = createBT(post,in,k);   //遞歸構造左子數
	b->rightChild = createBT(post+k,p+1,n-k-1);  //遞歸構造右子樹
	return b ;
}


//中序遍歷二叉樹BinaryTree:先遍歷左子樹,接着遍歷根節點,左後遍歷右子樹
//(不是左孩子節點和右孩子節點,概念要分清哦(雖然節點也是一個樹))
void showBTInOrder(BTNode *b)
{
	if(b!=NULL)
	{
		//遍歷左子樹
		showBTInOrder(b->leftChild);
		//遍歷根節點
		printf("%c",b->data);
		//遍歷右子樹
		showBTInOrder(b->rightChild);
	}
}

//後序遍歷二叉樹BinaryTree:先遍歷左子樹,接着遍歷右子樹,左後遍歷根節點
//(不是左孩子節點和右孩子節點,概念要分清哦(雖然節點也是一個樹))
void showBTPostOrder(BTNode *b)
{
	if(b != NULL)
	{
		//遍歷左子樹
		showBTPostOrder(b->leftChild);
		//遍歷右子樹
		showBTPostOrder(b->rightChild);
		//遍歷根節點
		printf("%c",b->data);

	}
}

int main()
{
	BTNode *b = NULL ;
	char in[] = "DGBAECF";
	char post[] = "GDBEFCA" ;
	b=createBT(post,in,7);
	//中序遍歷遍歷二叉樹
	printf("中序遍歷遍歷二叉樹:\n");
	showBTInOrder(b);
	printf("\n");
	//後序遍歷遍歷二叉樹
	printf("後序遍歷遍歷二叉樹:\n");
	showBTPostOrder(b);
	printf("\n");
	return 0 ;
}




程序運行結果:

中序遍歷遍歷二叉樹:
DGBAECF
後序遍歷遍歷二叉樹:
GDBEFCA
Press any key to continue

發佈了33 篇原創文章 · 獲贊 36 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章