先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树

2021年6月21日 1点热度 0条评论 来源: 寒雪无痕

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

    原文作者:寒雪无痕
    原文地址: https://blog.csdn.net/hanxue_wuhen/article/details/70215919
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。