二叉树第一期:树与二叉树的概念

一、树   

1.树的定义

与线性表不同,树是一种非线性的数据结构,由N(N>=0)个结点组成的具有层次关系的集合;因其形状类似生活中一颗倒挂着的树,故将其数据结构称为树。

2.树的相关概念

根结点

没有前驱的结点,称为根结点
子树以某个结点为根结点的所有后代结点(包括此结点),为该结点的子树,例如B、E、F组成的树,是A的子树
结点的度某个结点后继结点的个数,称为结点的度
叶(终端)结点某个结点后继结点的个数为0,称为叶结点
分支(非终端)结点某个结点后继结点的个数非0,称为分支结点
双亲(父)结点某个结点的前驱结点,称为该结点的双亲结点
孩子(子)结点某个结点的后继结点,称为该结点的孩子结点
兄弟结点某两个结点的前驱结点相同,则称为兄弟结点
堂兄结点某两个结点在同一个层次上,称为,堂兄结点
祖先某个结点到根结点的一条路线上的结点,统称为该结点的祖先
子孙某个结点的所有后代结点,统称为该结点的子孙
树的度最大的结点的度,称为树的度
树的高度(深度)根结点到叶结点,所经过结点的个数,最大的,称为树的高度,或深度
结点的层级某结点与根结点连线,所含义的结点个数
森林M(M>=2)个互不相交的树,称为森林

总结:

  • 一个树,其任意子树是互不相交的,否则就不叫树,而是图,这一树形结构,如B、C、D为根组成的树,不存在相交情况。
  • 任意一个树都可以看成根和子树,子树又可以看成,根和子树,所以树这一结构,是由递归搭建的。
3.树的表示

对树这一结构,有明确的了解后,又有一个新的问题,我们该如何的去表示的树的结构呢?常见的有孩子表示法,双亲表示法,孩子双亲表示法,孩子兄弟表示法;这里将介绍最好理解的孩子表示法,和优点明显的孩子兄弟表示法

i.孩子表示法
#define MAX 10 // 已知树的最大的深度

typedef int TDatetype;

typedef struct Tree
{
	TDatetype date;
	struct Tree* child[MAX];
}Tree;
ii.左孩子右兄弟表示法
typedef int TDatetype;

typedef struct Tree
{
	TDatetype date;
	struct Tree* child;
	struct Tree* brother;
}Tree;
 4.树的实际应用

我们文件的存储方式就是以树这一结构存储,每一个盘即为一个树,所有盘则组成一个森林,下面则是Linux系统下,文件的存储结构。

二、二叉树

1.二叉树的定义

在树的定义基础上,树的度最大不超过2的(每个结点的度最大不超过2的),即为二叉树。(注:二叉树有左孩子右孩子之分

2.特殊的二叉树
i.满二叉树

满二叉树的定义:树的深度为h,每一层都达到含有结点的最大个数,即第x(0<x<=h)层,结点个数 = 2^(x-1);

ii.完成二叉树

完全二叉树的定义:树的深度为h,前h-1层,结点个数达到最大值,第h层,从左到右有连续的结点。

3.二叉树的性质
  • 第H层结点个数:2^(H-1)
  • 高度为H的二叉树,所含有结点个数的最大值为2^H-1
  • N个结点的满二叉树,其高度为以2为底,log(N+1)
  • N个结点的完全二叉树,其高度为以2为底,log(N+X+1),X为相同高度的满二叉树与完全二叉树的结点个数差的绝对值
  • 终端结点的个数  = 度为2的结点个数 + 1
4.二叉树的表示
i.二叉树的顺序结构

二叉树的顺序结构:将一颗二叉树的数据,以层为顺序,依次存储在数组中(保留空结点的位置)。


typedef int BTDateType; // 重定义树的数据类型

typedef struct BinaryTree
{
	BTDateType* date; // 动态顺序表
	int size; // 当前顺序表存储数据的个数
	int capacity; // 当前顺序表的容量大小
}BinaryTree;

为什么要这么设计呢?

因为我们通过数组下标,可以得出其父亲或者两个孩子的结点位置;

  1. 某结点左孩子的下标 = 该结点的下标 * 2 + 1
  2. 某结点右孩子的下标 = 该结点的下标 * 2 + 2
  3. 某结点的父亲下标     = (该结点的下标 - 1) / 2

读者,若不相信,可以以上面示图为例子,代入数据,进行自我验证!!!

  • 根据此特性,
  • 首先:我们就可以理解了,为什么要留着空结点的位置,而不是直接把数据依次存入~
  • 最后:可以得出结论适合于存储完全二叉树,而不适合存储普通二叉树,因为普通二叉树,会造成大量的空间浪费。
ii.二叉树的链式结构

二叉树的链式结构,声明如下:孩子不存在,则用NULL表示;

typedef int BTDatetype;

typedef struct BinaryTree
{
	BTDatetype date; // 数据
	struct Tree* lift; // 左孩子
	struct Tree* right; // 右孩子
}BT;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/738831.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】时间复杂度

目录 一、算法的复杂度 二、时间复杂度 2.1 时间复杂度的概念 2.2 大O渐进表示法 2.3 计算时间复杂度步骤 三、常见时间复杂度举例 3.1 ❥ 常数阶 3.2 ❥ 线性阶 3.3 ❥ 平方阶 3.4 ❥ 对数阶 3.5 ❥ 指数阶 3.6 ❥ 多个未知数的复杂度 四、最好&#xff0c;最坏&am…

人工智能机器学习算法总结偏差和方差

1.定义 在机器学习中&#xff0c;偏差&#xff08;Bias&#xff09;和方差&#xff08;Variance&#xff09;是评估模型泛化能力的重要概念。它们描述了模型在训练数据上的表现以及对新数据的适应能力。 偏差&#xff08;Bias&#xff09; &#xff1a; 偏差是指模型的预测值与…

SARscape下载DEM进度条不动的问题

使用SARscape的DEM Extraction下载DEM&#xff0c;进度条不动问题的解决办法&#xff1a; 一个字&#xff1a; 我是等了一晚上&#xff0c;第二天就好了。下载的DEM范围是一景SAR影像&#xff0c;未裁剪。

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用 判断员工是否有权限访问&#xff0c;首先得知道现在操作的人是谁&#xff0c;所以必须先实现登录功能 2 登录流程 ① 提供登录页面&#xff0c;可输入用户名与密码信息&#xff0c;并添加执行登录的按钮。&#xff08;登录页面不能被拦截&#xff09;…

java之SSRF代码审计

1、SSRF漏洞审计点 服务端请求伪造&#xff08;Server-Side Request Forge&#xff09;简称 SSRF&#xff0c;它是由攻击者构造的 payload传给服务端&#xff0c;服务端对传回的 payload 未作处理直接执行后造成的漏洞&#xff0c;一般用于在内网探测或攻击内网服务。 利用&a…

捕捉过往的时光,5个步骤,安卓手机找回删除的照片

手机不仅仅是一个通讯工具&#xff0c;更是一个记录生活点滴的神器。手机照相机的出现&#xff0c;让我们随时随地都能捕捉到美好的瞬间&#xff0c;留下珍贵的回忆。然而&#xff0c;随着时间的推移&#xff0c;我们可能会不小心删除了这些照片&#xff0c;或者因为各种原因导…

分布式锁实现方案-基于Redis实现的分布式锁

目录 一、基于Lua看门狗实现 1.1 缓存实体 1.2 延迟队列存储实体 1.3 分布式锁RedisDistributedLockWithDog 1.4 看门狗线程续期 1.5 测试类 1.6 测试结果 1.7 总结 二、RedLock分布式锁 2.1 Redlock分布式锁简介 2.2 RedLock测试例子 2.3 RedLock 加锁核心源码分析…

DVWA-CSRF-samesite分析

拿DVWA的CSRF为例子 接DVWA的分析&#xff0c;发现其实Impossible的PHPSESSID是设置的samesite1. 参数的意思参考Set-Cookie SameSite:控制 cookie 是否随跨站请求一起发送&#xff0c;这样可以在一定程度上防范跨站请求伪造攻击&#xff08;CSRF&#xff09;。 下面用DVWA CS…

springboot加载bean的方式

在SpringBoot的大环境下&#xff0c;基本上很少使用之前的xml配置Bean&#xff0c;主要是因为这种方式不好维护而且也不够方便。 springboto注入bean主要采用下图几种方式&#xff0c; 1、注解装配Bean 1、使用Component等派生注解 只要在类上加类上加 Component 注解即可,该…

[图解]企业应用架构模式2024新译本讲解17-活动记录1

1 00:00:01,070 --> 00:00:04,180 下一个我们要说的就是 2 00:00:04,190 --> 00:00:06,740 活动记录模式了 3 00:00:07,640 --> 00:00:11,210 同样是数据源架构模式 4 00:00:12,300 --> 00:00:18,480 里面的一个&#xff0c;活动记录 5 00:00:18,490 --> 00…

万界星空科技低代码云mes核心功能详解!建议收藏!

在当今数字化时代&#xff0c;制造企业面临着日益复杂的生产管理挑战。为了提高生产效率、降低成本、优化资源利用&#xff0c;许多企业开始转向云端制造执行系统&#xff08;MES&#xff09;。云MES系统作为数字化转型的关键组成部分&#xff0c;具有一系列核心功能和优势&…

Maven深度解析:Java项目构建

Maven是一个由Apache软件基金会维护的软件项目管理和理解工具&#xff0c;它主要服务于基于Java的软件项目。。 Maven深度解析&#xff1a;Java项目构建 引言 在Java开发领域&#xff0c;项目构建和管理是一个复杂而关键的任务。Maven作为这一领域的佼佼者&#xff0c;以其声…

MySQL的综合运用

MySQL版的葵花宝典&#xff0c;欲练此功&#xff0c;挥刀自。。。呃&#xff0c;&#xff0c;&#xff0c;说错了&#xff0c;是先创建两个表&#xff0c;分别是location表和store_info表 示例表为location表和store_info表&#xff0c;如下图所示&#xff1a; 操作一&#xf…

OpenAI Sora:我们来自混乱,我们也将回归混乱

最近&#xff0c;我开始深入了解并整理一些关于Sora这个人工智能模型的系列文章。我的目标是从两个角度深入探讨&#xff1a;一是Sora的技术细节&#xff0c;包括它的原理和功能&#xff1a;OpenAI Sora&#xff1a;距离黑客帝国仅一步之遥&#xff0c;二是Sora的应用前景&…

告别繁琐!一键互换新旧文件夹名,高效批量改名神器助您轻松管理文件库

在日常工作中&#xff0c;我们经常需要对文件夹进行命名和重命名操作。然而&#xff0c;当面对大量需要互换新旧名称的文件夹时&#xff0c;传统的手动操作不仅效率低下&#xff0c;还容易出错。为了解决这一难题&#xff0c;我们特别推出了一款高效、便捷的文件夹批量改名工具…

【GD32F303红枫派使用手册】第二十四节 DHT11温湿度传感器检测实验

24.1 实验内容 通过本实验主要学习以下内容&#xff1a; DHT11操作原理 单总线GPIO模拟操作原理 24.2 实验原理 HT11是一款已校准数字信号输出的温湿度一体化数字传感器。该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点信号&#xff0c;传输距离可达20米以…

nginx负载均衡案例,缓存知识----补充

负载均衡案例 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near great all on wordpress.* to wp172.16.1.% indentified by 1 at line 1 MariaDB [(none)]>…

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#&#xff0c;C中的实际应用案例C#示例C示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试…

算法常见手写代码

1.NMS def py_cpu_nms(dets, thresh):"""Pure Python NMS baseline."""#x1、y1、x2、y2、以及score赋值x1 dets[:, 0]y1 dets[:, 1]x2 dets[:, 2]y2 dets[:, 3]scores dets[:, 4]#每一个检测框的面积areas (x2 - x1 1) * (y2 - y1 1)#按…