数据结构之-----二叉树

news/2024/7/24 9:33:21 标签: 数据结构, c语言, 开发语言, 深度学习

目录

本章内容如下:

        1:树的相关概念与结构

        2:二叉树的概念与结构

        3:二叉树的链式结构与实现


        文章正式开始,让我们一起学习树吧!!

        

        一:树的概念

                树是一种非线性结构 ,与我们前面所学的顺序表与链表不同,数据元素的对应是1对多的关系,只有一个根结点,且除了根节点其它的结点有且仅有1个前驱结点(父结点)

                我们可以将一棵树看作由很多个结构相似子树组成,所以树是递归定义的。

              注意:在树形结构中子树不能出现相交,简单的来说就是一棵树中不能出现闭合的结构。

         1.1:树的相关概念

              节点的度:一个结点含有子树的个数称为该节点的度。

               叶结点或终端结点:度为0的结点,称为叶节点。

                非终端节点或分支结点:度不为0的结点。

                双亲结点或父节点:结点的前驱结点曾为它的父节点或双亲结点。

                兄弟结点:具有相同父节点的结点。

                树的度:树中最大节点的度称为树的度。

                节点的层次:从根开始定义起,根为第一层,子节点自增。

                树的高度:树中节点的最大层次。

                堂兄弟结点:双亲在同一层的结点。

                结点的祖先:从根到该节点所经分支上的所有节点。

                子孙:在某一棵树中,选定根节点之后所有的其它节点都是该节点的子孙。

                森林:由m(m>0)棵互不相交的树的集合称为森林。

                1.2:树的结构(表示)

                        

        

         

        我们应该如何来表示这棵树呢?

        因为我们不仅要保留节点的值,还需要保留结点与结点的关系。

        在实际中有许许多多的方法可以用来表示树的结构,我们来介绍一种非常牛逼的方法,叫做孩子兄弟法。

        

       

         比如我们想要表示上述的这棵树。

        我们定义一个结点:

                

struct TreeNode
{
	int val;
	struct TreeNode* FirstChild;
	struct TreeNode* brother;

};

        用图来表示---->

                 其实在我们电脑中经常会使用到树这个数据结构,比如我们的磁盘放置文件的结构就是这样的。还有在我们Linux系统上。

        

         二:二叉树相关概念与结构

                2.1:概念

                二叉树:由根节点与左右子树构成,且节点的度不超过2。

                任何二叉树都是由一下几种情况复合而成的->

                        

        对于任何一颗二叉树我们都可以将他看成三个部分:根左子树右子树,看成这样的结构的时候我们有利于采用分治的思想解决二叉树的有关问题。

                二叉树的子树有左右之分,不能跌倒它们的次序,所以二叉树是有序树。

        2.2特殊的二叉树

        在二叉树中有两种特殊的树:满二叉树与完全二叉树

        满二叉树:一个二叉树中,每一层的结点的个数都达到了最大值,假设高度为h,那么我们可以通过推理可以得出结点的个数为:2^h-1

        如图:

        

        

        完全二叉树:假设高度为h,在一棵二叉树中,前h-1层是满二叉树,且第h层结点是连续的

        它的结点的范围为:[2^(h-1),2^h-1].

        2.3:二叉树的性质

        规定根节点的层数为1

                1:一棵非空二叉树的第i层最多有2^(h-1)个结点

                2:深度为h的二叉树,最多有2^h-1个结点。

                3:对于任何一颗二叉树度为0结点的个数等于度为2结点的个数加1:n0=n2+1;

                4:具有n个结点的满二叉树的深度为:h=log(n+1).

    三:二叉树的链式结构

        这里我们采用简单一点的二叉树结构,我们手动的创建二叉树

        代码如下:

定义结构的代码:

        

typedef int TreeDataType;
typedef struct BinaryTreeNode
{
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
	TreeDataType val;
}TRNode;

	TRNode* node1=BuyTreeNode(1);
	TRNode* node2= BuyTreeNode(2);
	TRNode* node3 = BuyTreeNode(3);
	TRNode* node4 = BuyTreeNode(4);
	TRNode* node5 = BuyTreeNode(5);
	TRNode* node6 = BuyTreeNode(6);

	node1->left = node2;
	node2->left = node3;
	node1->right = node4;
	node4->left = node5;
	node4->right = node6;

        3.1二叉树的遍历

        二叉树的遍历是我们学习二叉树最简单的操作,有三种遍历方式且我们遍历一个结点只操作一次。

        前序遍历:访问的方式为:根 左子树 右子树

          代码如下:

        

void prevOrder(TRNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;

	}
	printf("%d ", root->val);
	prevOrder(root->left);
	prevOrder(root->right);
}

        接下来我们采用递归展开图的方式来详细讲解这段代码的意思。

        

        中序遍历:左子树 根 右子树

        代码:

        

void InOrder(TRNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->val);
	InOrder(root->right);


}

    这里就不详细讲解了。

        后序:左子树 右子树 根

        

void postOrder(TRNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}
	postOrder(root->left);
	postOrder(root ->right);
	printf("%d ", root->val);
}

                本章分享完毕,感谢大家的观看。

        


http://www.niftyadmin.cn/n/5034061.html

相关文章

25、字符缩放显示任意大小(LCD|OLED)

在常见的显示屏中无论是 ASCII 字符还是 GB2312 的字符,都只能显示字库中设定的字体大小,例如,我们想显示一些像素大小为 48x48 的字符,那我们又得制作相应的字库,非常麻烦。为此在野火的基础上编写了一些函数&#xf…

PyCharm克隆github上开源的项目

PyCharm怎么clone github上开源的项目 一、先要确保PyCharm正确的配置了Git 如果你已经在PyCharm中配置好了Git,可以跳过此步骤,直接看下一步。 那么怎么在PyCharm中配置Git呢? 百度搜索Git安装包,安装过程不再多说&#xff0…

使用差分进化算法进行关键帧提取:Python实践与详细指南

1. 差分进化算法简介 差分进化算法(Differential Evolution, DE)是一种为实数编码的全局优化问题设计的启发式搜索方法。DE的基本原理是通过对种群中的个体进行差分变异、交叉和选择操作来进化种群,使种群逐渐趋近于问题的全局最优解。 DE算法的基本步骤包括: 初始化:随…

IO学习系列之使用read和write复制文件内容

read函数&#xff1a;功能&#xff1a;从文件fd中读取count个字节&#xff0c;存放进指针buf&#xff1b;具体内容&#xff1a; #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); /* 参数&#xff1a;fd&#xff1a; 文件描述符buf&#xff1a; 用来…

汽车行业新闻稿怎么写?怎么写关于汽车的新闻稿?

撰写汽车行业新闻稿需要遵循一定的结构和要点&#xff0c;以确保内容准确、清晰&#xff0c;并能吸引读者的兴趣。以下是关于汽车的新闻稿的一些写作要点和建议&#xff0c;接下来伯乐网络传媒就来给大家分享一下&#xff1a; 标题醒目&#xff1a;新闻稿的标题应该简洁明了&am…

【多卡训练报错】:The server socket has failed to listen on any local network address.

错误&#xff1a; RuntimeError: The server socket has failed to listen on any local network address. The server socket has failed to bind to [::]:16664 (errno: 98 - Address already in use). The server socket has failed to bind to 0.0.0.0:16664 (errno: 98 -…

springcloud3 指定nacos的服务名称和配置文件的group,名称空间

一 指定读取微服务的配置文件 1.1 工程结构 1.2 nacos的配置 1.配置文件 2.内容 1.3 微服务的配置文件 1.bootstrap.yml内容 2.application.yml文件内容 1.4 验证访问 控制台&#xff1a; 1.5 nacos服务空间名称和groupid配置 1.配置文件配置 2.nacos的查看

Vue3+Ts中使用Jquery

1、安装jquery&#xff1a;npm i jquery --save 2、在vue.config.js文件中添加如下代码&#xff1a; const { defineConfig } require(vue/cli-service) const webpack require(webpack)module.exports defineConfig({configureWebpack: {plugins: [// 配置jQuerynew webp…