数据结构之《二叉树》(上)

news2024/9/23 0:29:13

在之前的数据结构的学习中,我们了解了顺序表、链表等线性表,接下来在本篇中将要学习一种非线性的数据结构——树,我们将来了解树的相关概念和性质,在树当中将重点学习二叉树的结构和特性。学习完相关概念后将试着实现二叉树,解决二叉树相关的问题。接下来就开始本篇的学习吧!!!


1.树 

 1.树的概念与结构

是一种非线性的数据结构,它是由 n(n>=0) 个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的

• 有一个特殊的结点,称为根结点,根结点没有前驱结点。
• 除根结点外,其余结点被分成 M(M>0) 个互不相交的集合 T1、T2、……、Tm ,其中每一个集合
Ti(1 <= i <= m) 又是⼀棵结构与树类似的子树。每棵⼦树的根结点有且只有⼀个前驱,可以
有 0 个或多个后继。因此,树是递归定义的。

 

 注意:树形结构中,子树之间不能有交集,否则就不是树形结构

例如以下就为非树形结构:

 因此树形结构需要有以下特性
• 子树是不相交的(如果存在相交就是图)
• 除了根结点外,每个结点有且仅有一个父结点
• 一棵N个结点的树有N-1条边

1.2 树相关术语 

父结点/双亲结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点

子结点/孩子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结

结点的度:⼀个结点有几个孩子,他的度就是多少;比如A的度为6,F的度为2,K的度为0

树的度:一棵树中,最大的结点的度称为树的度; 如上图:树的度为 6

叶子结点/终端结点:度为 0 的结点称为叶结点; 如上图: B、C、H、I... 等结点为叶结点

分支结点/非终端结点:度不为 0 的结点; 如上图: D、E、F、G... 等结点为分支结点

兄弟结点:具有相同父结点的结点互称为兄弟结点(亲兄弟); 如上图: B、C 是兄弟结点 

结点的层次:从根开始定义起,根为第 1 层,根的子结点为第 2 层,以此类推;

树的高度或深度:树中结点的最大层次; 如上图:树的高度为 4

结点的祖先:从根到该结点所经分⽀上的所有结点;如上图: A 是所有结点的祖先

路径:一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列;比如A到Q的路径为:A-E-J-Q;H到Q的路径H-D-A-E-J-Q

子孙:以某结点为根的子树中任一结点都称为该结点的⼦孙。如上图:所有结点都是A的子孙

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

1.3 树的表示 

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩⼦表示法、孩子双亲表示法以及孩子兄弟表示法等。在此我们就来了解其中最常用的孩子兄弟表示法

struct TreeNode
{
// 左边开始的第⼀个孩⼦结点
    struct Node* child;
// 指向其右边的下⼀个兄弟结点
    struct Node* brother; 
// 结点中的数据域
    int data;
};

例如以上的树用孩子兄弟表示法来表示后就可以画出以下的图示

 

1.4 树形结构实际运用场景

在我们的电脑当中许多的场景都用到树,例如在文件系统中,文件系统是计算机存储和管理文件的⼀种方式,它利用树形结构来组织和管理⽂件和⽂件夹。在文件系统中,树结构被⼴泛应用,它通过⽗结点和⼦结点之间的关系来表示不同层级的文件和文件夹之间的关联。

2. 二叉树

 

2.1二叉树的概念与结构

在学习了树的相关概念后,接下来来了解在树当中用得最多的结构——二叉树二叉树是结点的一个有限集合,该集合由一个根结点加上两棵别称为左子树和右子树的二叉树组成或者为空。

在二叉树中有以下的特征:
1.在二叉树当中不存在度大于2的节点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

注意:任意二叉树是都是由以下这几种情况复合而成的

 

 2.2特殊的二叉树

2.2.1满二叉树

一个二叉树,如果每⼀个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果⼀个二叉树的层数为k ,且结点总数是 2^{k}-1 ,则它就是满二叉树。

在此计算满二叉树的的总节点数公式是由等比数列求和公式Sn=\frac{a1(1-q^{n})}{1-q}得到的,在满二叉树中公比就为2,因此Sn=2^{n}-1

2.2.2 完全二叉树

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为 K 的,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从 1 至 n 的结点一一对应时称之为完全二叉树。
注意:满二叉树是一种特殊的完全二叉树

完全二叉树会有以下的性质
💡 二叉树性质
根据满二叉树的特点可知:
(1)若规定根结点的层数为 1 ,则⼀棵非空二叉树的第i层上最多有 2^{i-1} 个结点
(2)若规定根结点的层数为 1 ,则深度为 h 的二叉树的最大结点数是2^{h}-1
(3)若规定根结点的层数为 1 ,具有 n 个结点的满二叉树的深度 h=\log_{2}n+1 ( log以2为底, n+1 为对数)

因此一个二叉树要是完全二叉树就要除了第h层外,其他层都要为最大节点数,且在第h层内的节点必须按照从左向右的方式排列

以下的二叉树就不是完全二叉树

 

2.3 二叉树存储结构 

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

2.3.1顺序结构

顺序结构存储就是使用数组来存储,⼀般使用数组只适合表示完全⼆叉树,因为不是完全二叉树会有空间的浪费,完全二叉树更适合使用顺序结构存储。

例如以下的二叉树使用数组来存储后就为以下形式

而在使用数组来存储非完全二叉树时就会有空间的浪费,例如以下的二叉树的顺序存储

 

这时你可能会想为什么在使用数组存储二叉树的结点数据时直接将每个数据依次存放到数组当中,这样不就不会有空间的浪费的问题吗?

就像以下形式在数组内存储上面的二叉树 

但这样在数组中存储就会存在问题,就是比如当只知道一个节点的数据在数组中存储的下标时当我们要找这个结点的父结点或者是孩子结点就会无法找到对应的数组下标,因此这种方法是行不通的

在二叉树中接下来要学习的堆(一种二叉树)就是使用顺序结构的数组来存储的
注意:这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

2.3.2链式结构 

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链。

 

 

 

 

以上就是二叉树(上)的全部内容了,接下来在二叉树(中)将继续学习二叉树的知识,在下一篇中我们将重点学习堆的相关知识,未完待续…… 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我是怎么解决一个电力采集问题的全过程分享

行业设备联网&#xff0c;没人开发/开发太慢/投入太大 怎么办&#xff1f;用合宙DTU整体解决方案&#xff01; 一、整体解决方案内容 合宙DTU整体解决方案 DTU硬件&固件SIM卡业务云平台APP&小程序&web h5页面看板&#xff1b; 合宙提供的DTU整体解决方案&#x…

免费【2024】springboot 宠物中心信息管理系统app

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

【超级宠物】-对战游戏

【超级宠物】是一款轻松好玩的休闲趣味卡通宠物模拟养成游戏,游戏中玩家需要不断的训练你的小宠物以参加比赛,你将会是一名专业的训宠物大师,成功的培养自己的宠物成为宠物之星。 超级宠物是一款充满趣味的休闲趣味宠物养成模拟竞技游戏&#xff0c;游戏中玩家需要培养你的狗狗…

Ollama0.3.0 + llama3.1本地部署

Ollama0.3.0 llama3.1本地部署 安装Ollama 官网下载安装包 https://ollama.com/download ​​ 根据系统选择对应版本 安装完成后&#xff0c;电脑右下角会出现ollama程序图标&#xff0c;表示ollama正在运行。 ​​ 打开cmd命令 下载Llama3.1 输入ollama&#xff0c…

51单片机嵌入式开发:22、STC89C52R控制 实现单总线温度传感器DS18b20的温度读取

STC89C52R控制 实现单总线温度传感器DS18b20的温度读取 1 概述1.1 介绍1.2 特点1.3 应用领域 2 DS18B20原理详解2.1 内部机理2.2 读写时序2.3 DS18B20操作代码程序 3 演示4 总结 配套演示例程 1 概述 DS18B20是一款数字温度传感器&#xff0c;由Maxim Integrated&#xff08;美…

linux下frambuffer的使用

什么是Framebuffer&#xff1f; Framebuffer是一个内存区域&#xff0c;操作系统可以通过它直接控制显示设备的像素。与传统的图形加速硬件不同&#xff0c;framebuffer不依赖于图形处理器&#xff0c;而是通过CPU来处理图形数据。这种方式虽然在性能上可能不如硬件加速&#…

vegecad画线及调整功能

vegecad添加了绘制直线和层颜色&#xff0c;目前没有线型&#xff0c;点击工具按钮"画线"&#xff0c;画线是连续的画&#xff0c;右键结束&#xff0c;下面是画的 vegetable&#xff0c;目前画线没有捕捉和引导线画特定角度的线&#xff0c;所以现在还是涂鸦式的&am…

昇思25天学习打卡营第XX天|RNN实现情感分类

希望代码能维持开源维护状态hhh&#xff0c;要是再文件整理下就更好了&#xff0c;现在好乱&#xff0c;不能好fork tutorials/application/source_zh_cn/nlp/sentiment_analysis.ipynb MindSpore/docs - Gitee.com

Redis架构之主从复制

Redis主从架构 主从集群&#xff0c;实现读写分离 主从数据同步 主从同步流程 slave节点向master节点发送replicaof命令建立连接&#xff0c;随后发送 psync {repID} {offset} 指令&#xff0c;repID表示主节点唯一标识&#xff0c;offset为复制偏移量。如果是第一次同步&…

软件测试——Bug篇

什么是BUG 定义&#xff1a; ⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 1. 当且仅当规格说…

Java面试——Tomcat

优质博文&#xff1a;IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个Server可以包含至少一个Service&#xff0c;用于具体提供服务。Service主要包含两个部分&#xff1a;Connector和…

【C语言】“void” 如何在 C 语言中开创无限可能

目录 C语言void关键字详解void关键字的功能和应用详细说明 1. void作为函数返回类型示例代码输出结果 2. void作为函数参数示例代码输出结果 3. void*通用指针示例代码输出结果 4. void与NULL示例代码输出结果 5. void与函数指针示例代码输出结果 6. void的限制和注意事项6.1 不…

AI技术革命对未来就业的影响

一、引言 AI技术革命带来的就业结构变化是双面的&#xff0c;既存在着挑战也蕴含着机遇。过去的几次技术革命例如工业革命和信息技术革命都对就业结构产生了深刻的影响&#xff0c;使一些工作消失&#xff0c;也催生了许多新的工作类型。当前和未来的AI技术发展也必将推动类似…

Vue3 + js-echarts 实现前端大屏可视化

1、前言 此文章作为本人大屏可视化项目的入门学习笔记&#xff0c;以此作为记录&#xff0c;记录一下我的大屏适配解决方案&#xff0c;本项目是基于vite Vue3 js less 实现的&#xff0c;首先看ui&#xff0c;ui是网上随便找的&#xff0c;代码是自己实现的&#xff0c;后面…

昇思25天学习打卡营第XX天|基于MindSpore通过GPT实现情感分类

其实数据集和模型的其他大平台接口的&#xff0c;感觉不用非包在自己包里 %env HF_ENDPOINThttps://hf-mirror.com mindnlp.transformers 库中的 GPTTokenizer 类来加载和处理与GPT&#xff08;生成式预训练变换器&#xff09;模型兼容的分词器&#xff0c;并添加特殊的控制标…

Vmware创建centos后使用yum报错(网络连接正常)

安装完centos虚拟机后&#xff0c;yum报错信息如下&#xff1a; 快速解决方法 删除原有yum文件 rm -f /etc/yum.repos.d/CentOS-Base.repo 然后重新下载阿里的&#xff1a; wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 清理…

ctfshow-web入门-sql注入(web171-web175)

目录 1、web171 2、web172 3、web173 4、web174 5、web175 1、web171 单引号测一下&#xff0c;报错 -- 闭合后回显正常 也可以用 # &#xff0c;不过需要 URL 编码 成功闭合之后&#xff0c;先判断下字段数&#xff1a; 1 order by 3-- 3 的时候正常 4 的时候报错&am…

MyBatis 动态代理和映射器

一、映射器简介 1.什么是mapper动态代理? 在接口中有方法的返回值定义&#xff0c;参数的定义&#xff0c;方法名&#xff0c;在sqlMapper.xml 中也对应这接口给予了赋值&#xff0c; 这时候dao的实现类就显得多余&#xff0c;这是Mybatis可以帮助我们自动产生实现类&#xf…

H5+JS 4096小游戏

主要实现 1.使用WASD或方向按钮控制游戏 2.最高值4096&#xff0c;玩到4096视为胜利 3.随机生成2、4、8方块 4.移动方块 5.合并方块 JS代码干了什么 初始化游戏界面&#xff1a;创建游戏板和控制按钮。 定义游戏相关变量&#xff1a;如棋盘大小、棋盘状态、得分等。 初始化棋…

【MATLAB源码】机器视觉与图像识别技术实战示例文档---鱼苗面积预测计数

系列文章目录 第一篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术—视觉系统的构成(视频与图像格式转换代码及软件下载) 第二篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术(2)—图像分割基础 第三篇文章&#xff1a;【MATLAB源码】机器视觉与图像识别技术…