数据结构12:二叉树的API及其实现

文章目录

简介

在上一节,我们讲了二叉树的数据结构和遍历方式。这一节,我们讲解二叉树的API函数以及其实现方式。二叉树的API函数如下所示:

c 复制代码
//二叉树生成函数
treeNode* TreeCreate(void);
//二叉树的前序遍历
int PreOrder(treeNode *T);
//二叉树的中序遍历
int InOrder(treeNode *T);
//二叉树的后序遍历
int PostOrder(treeNode *T);
//二叉树的销毁
int TreeDestory(treeNode **T);

函数递归

二叉树的API函数,几乎都是以递归函数的方式实现,在介绍二叉树的API前,我们简单了解一下递归。

简单的说,函数递归就是函数通过自己调用自己来实现某些功能。它需要满足条件:1.有反复执行的过程(调用自身)2.有跳出反复执行过程的条件(递归出口)。下面我们来看一个简单的例子,函数阶乘的递归实现,代码如下:

执行结果如图1所示:

c 复制代码
#include"stdio.h"
#include"stdlib.h"
int Factorial(int n)
{
	int ret;
	//输入数据检测
	if (n < 0)
	{
		printf("Input Error\n");
		return -1;
	}
	//跳出判断
	if (n == 0 || n == 1)
	{
		ret = 1;
	}
	else
	{
		//调用自身
		ret = Factorial(n - 1)*n;
	}
	return ret;
}
int main()
{
	printf("%d\n",Factorial(3));
	system("pause");
	return 0;
}

在上面的代码中,我们可以看到递归的实现及其满足的两个条件。对于递归,如果感兴趣的话,可以看我们C语言部分的教程。

二叉树API介绍及其实现

创建函数

二叉树生成函数

c 复制代码
treeNode* TreeCreate(void)
{
	char data;
	treeNode *T = NULL;

	scanf("%c",&data);
	if (data == '#')
	{
		T = NULL;
	}
	else
	{
		T = (treeNode*)malloc(sizeof(treeNode));
		memset(T, 0, sizeof(treeNode));
		T->data = data;
		T->lchild = TreeCreate();
		T->rchild = TreeCreate();
	}
	return T;
}

创建时采用字符"#"代表"NULL",当输入"#"时表示树的左孩子或右孩子为NULL,即没有对应的孩子。创建二叉树时,当输入的字符不为"#"时,分配一个treeNode大小的内存空间,用来存储节点数据,然后采用调用自身完成创建。输入数据时,按照前序遍历的数据输入数据。例如要要生成如图2中的树,要输入:ABD##E##CF##G##。

应用代码:

c 复制代码
treeNode *Tree = NULL;
Tree = TreeCreate();

前序遍历

二叉树的前序遍历

c 复制代码
int PreOrder(treeNode *T)
{
	if (T == NULL)
	{
		return -1;
	}
	printf("%c\n", T->data);
	PreOrder(T->lchild);
	PreOrder(T->rchild);
	return 0;
}

前序遍历,首先打印节点数据(实际使用时,可以对应其他需要的操作),然后在递归访问左右子树。

应用代码:

c 复制代码
printf("前序遍历:\n");
PreOrder(Tree);

中序遍历

二叉树的中序遍历

c 复制代码
int InOrder(treeNode *T)
{
	if (T == NULL)
	{
		return -1;
	}
	InOrder(T->lchild);
	printf("%c\n", T->data);
	InOrder(T->rchild);
	return 0;
}

中序遍历,首先递归访问左子树,然后打印节点数据(实际使用时,可以对应其他需要的操作),最后在递归访问右子树。

应用代码:

c 复制代码
printf("中序遍历:\n");
InOrder(Tree);

后序遍历

二叉树的后序遍历

c 复制代码
int PostOrder(treeNode *T)
{
	if (T == NULL)
	{
		return -1;
	}
	PostOrder(T->lchild);
	PostOrder(T->rchild);
	printf("%c\n", T->data);
	return 0;
}

后序遍历,首先递归访问左右子树,然后打印节点数据(实际使用时,可以对应其他需要的操作)。

应用代码:

c 复制代码
printf("后序遍历:\n");
PostOrder(Tree);

销毁函数:

二叉树的销毁

c 复制代码
int TreeDestory(treeNode **T)
{
	if (T == NULL)
	{
		//非法输入
		return -1;
	}
	if (*T == NULL)
	{
		//空树
		return -1;
	}
	//遍历左子树
	if ((*T)->lchild != NULL)
	{
		TreeDestory(&(*T)->lchild);
		(*T)->lchild = NULL;
	}
	//遍历右子树
	if ((*T)->rchild != NULL)
	{
		TreeDestory(&(*T)->rchild);
		(*T)->rchild = NULL;
	}
	//删除节点
	if (*T != NULL)
	{
		free(*T);
		*T = NULL;
	}
	return 0;
}

销毁函数也采用递归的方式,访问各个节点,然后释放内存,并将指针指向NULL。

应用代码:

c 复制代码
TreeDestory(&Tree);

小结

二叉树的API函数都是通过递归实现的,理解递归后会很好理解其API函数的实现方式。二叉树的API的实现方法,对我们的编程也有很多可借鉴之处。

相关推荐
梵刹古音几秒前
【C语言】 定义变量
c语言·开发语言·嵌入式
我能坚持多久3 分钟前
D19—C语言动态内存管理全解:从malloc到柔性数组
c语言·开发语言·柔性数组
代码无bug抓狂人5 分钟前
C语言之宝石组合(蓝桥杯省B)
c语言·开发语言·蓝桥杯
LYS_06188 分钟前
寒假学习(9)(C语言9+模数电9)
c语言·开发语言·学习
少许极端20 分钟前
算法奇妙屋(二十六)-二叉树的深度搜索问题
算法·二叉树·dfs
2401_8414956421 分钟前
【LeetCode刷题】二叉树的中序遍历
数据结构·python·算法·leetcode··递归·遍历
pcm12356722 分钟前
设计C/S架构的IM通信软件(2)
java·c语言·架构
枫叶丹431 分钟前
【Qt开发】Qt系统(十)-> Qt HTTP Client
c语言·开发语言·网络·c++·qt·http
范纹杉想快点毕业32 分钟前
自学嵌入式系统架构设计:有限状态机入门完全指南,C语言,嵌入式,单片机,微控制器,CPU,微机原理,计算机组成原理
c语言·开发语言·单片机·算法·microsoft
leiming633 分钟前
c语言更进一步
c语言·开发语言