深入理解【二叉树】

 

📙作者简介: 清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。

📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。

欢迎点赞 👍 收藏 ⭐留言 📝 如有错误还望各路大佬指正!

✨每一次努力都是一种收获,每一次坚持都是一种成长✨       

 

a6c0473e16e249c2b9ca02e5b793f35e.gif#pic_center

目录

 

 前言

1. 特殊二叉树

1.1 满二叉树

1.2 完全二叉树

1.3 二叉树的性质

2. 搜索二叉树

3. 练习

📖 题目一

📖 题目二

📖 题目三 

总结


 

 

 前言

        在计算机科学领域中,二叉树作为一种重要的数据结构,被广泛应用于各种算法和问题的解决方案中。然而,对于许多人来说,二叉树仍然是一个神秘而复杂的概念。本篇博客将带领你一同深入探索二叉树的内在结构和特性,帮助你建立起对二叉树的全面理解。


1. 特殊二叉树

         前边我们已经介绍了树的结构,也了解了普通二叉树,以及二叉树的遍历,今天我们将会继续深入学习二叉树。

1.1 满二叉树

        一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。如下图:

d71c2e3bdfd340e0ba6b5231439169f4.png


 1.2 完全二叉树

        完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。(直白点说就是:假设有n层,前n-1层为满二叉树,最后一层的节点从左到右依次连接,不会出现一个节点连不满的情况)

如下图:

e175d90e1297478dbc615a25111db280.png

        这样的它就不属于完全二叉树:

9540a312cedd427d8673daf70ff49cbf.png

 因为从左到右,有节点没有满(从左到右节点必须连满,不能出现有空)。

1.3 二叉树的性质

  1.  若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2⁽ⁱ⁻¹⁾个结点.
  2.  若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2ʰ-1
  3.  对任何一棵二叉树, 如果度为0其叶结点个数为 , 度为2的分支结点个数为 ,则有 n₀=n₂+1(下标为二叉树的度)
  4.  若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log₂(n+1)

        对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:

  • 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
  •  若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
  •  若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

2. 搜索二叉树

        上述的二叉树对于数据存储没什么特别规定与要求,属于普通二叉树大类,对于普通二叉树来说,没有增删查改,普通二叉树的增删查改在现实应用中是没有意义的(数据没有特殊规定,无法确认新增节点的位置)。所以这里我们再来介绍一下其他的二叉树——搜索二叉树

         什么是搜索二叉树?如下图:

20f39fc751d5462f94d438b0fc0604a6.png

         任何一颗树,左子树都要比根小,右子树都要比根大。搜索二叉树的这个特性使得它的插入位置就可以确定。例如我们要插入一个数据38:

46b403eb595040bcbdc900162ec07775.png

         从根开始,38比35大,就进入右子树,38比39小,那就插入到39左子树的位置。

例如我们再插入一个40:

8f87dae73c7945b5a266b2a48e1c0cf7.png

         从根开始,40比35大,就进入右子树,40比39大,进入右子树,40比65小,那就插入到65的左孩子节点位置。

        如果我们要查找一个数,例如我们查找30,30比35小,进入左子树,30比17大,进入右子树,30比20大继续进入到右子树,但20没有子节点,所以没有30这个节点,到这里就停止寻找。通过这些例子我们可以发现,这样的二叉树很适合搜索。搜索二叉树最多搜索高度次。

        搜索的时间复杂度是O(N),细心的同学可能就会发现,搜素二叉树最多搜素高度次,那二叉树的高度不是有一个公式h= log₂(n+1),时间复杂度为什么不是O(log N)?

         这里注意:这个二叉树的高度公式针对的是满二叉树,而搜素二叉树它可能出现退化的情况。如下图:

8d3ee5a13daf44318153982b4966901e.png

 最坏的情况:我们找1这个节点,它的时间复杂度就是O(N)。

那要如何避免这种情况的发生?使左右两边的节点数量均匀,又要保持这个特性。

 这里又可以引出一个新的概念——平衡树

 平衡树的特性就是:左右两边的节点数据比较均匀。

 平衡树又可以分为:

  • AVL树
  • 红黑树

         依照现在博客所讲的水平,想要学会这两种树是不可能的,除此之外后续我们还会学习B树,它是一种多叉搜索树。数据库的原理就与它有关。(此部分为了解)这部分的树状结构才是有用的东西,精髓就在这部分内容,这里我们后续会进行学习。

        本期我们不会进行代码的编写介绍,我们要弄清楚二叉树的性质,以及延申部分。接下来就是练习部分,帮助大家理解掌握二叉树的性质。

 3. 练习

📖 题目一

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为  ()

A、不存在这样的二叉树

B、200

C、198

D、199

✨题目解析:

        度为2的节点有199个,根据二叉树的性质:n₀=n₂+1,度为0的节点个数等于度为2的节点个数+1。度为0的节点就为叶子节点。

 

正确答案:B

📖 题目二

2. 在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A、n

B、n+1

C、n-1

D、n/2

✨题目解析:

        这道题目看似无解,突破口就在完全二叉树。我们设度为0的节点个数为N0,度为1的节点个数为N1,度为2的节点个数为N2。根据性质可知:N0=N2+1,且N0+N1+N2=2n。

        两式联合:N0+N1+N0-1=2n。

又因为这是一颗完全二叉树,完全二叉树度为1的节点只能有1个或没有。但又要确保都为整数,所以度为1的节点就只要1个。即:N0+1+N0-1=2n

 

正确答案:A

📖 题目三 

3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )

A、11

B、10

C、8

D、12

✨题目解析:

        题目要求这棵树的高度,那就设树的高度为h,最后一层缺了X个,根据定义我们可知:满二叉树是一种特殊的完全二叉树。

        由此可得出:2^h-1-X就是完全二叉树的节点个数,即:2^h-1-X=531。到这里看似无解,但我们还可以根据性质进行推算,X的取值范围是0  ~  2^(h-1)-1,至少最后一层有1个节点,最多最后一次为满(满二叉树),知道这些我们就可以带选项进行推算了。代换:2^h-1-2^(h-1)+1。代入选项,看最终哪个选项的结果最接近500。

        代入11,2的11次方:2048-1024=1024,如果高度是11那最少有1024个节点,A选项错误。这样依次代入。

 

正确答案:B


总结

        通过本篇博客我们对二叉树的内在结构、特性,有了更全面的了解,希望通过本篇博客的阅读,你已经掌握了深入理解二叉树的关键知识。最后,感谢阅读!

 

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

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

相关文章

Java中的异常

认识异常 异常就是程序出现的问题&#xff1b; Integer.valueOf("aaaa"); 异常体系 因为写代码时经常会出现问题&#xff0c;Java的设计者们早就为我们写好了很多个异常类&#xff0c;来描述不同场景下的问题。而有些类是有共性的所以就有了异常的继承体系 Error&…

日志采集分析ELK

这里的 ELK其实对应三种不同组件 1.ElasticSearch&#xff1a;基于Java&#xff0c;一个开源的分布式搜索引擎。 2.LogStash&#xff1a;基于Java&#xff0c;开源的用于收集&#xff0c;分析和存储日志的工具。&#xff08;它和Beats有重叠的功能&#xff0c;Beats出现之后&a…

OLED透明屏采购指南:如何选择高质量产品?

着科技的不断进步&#xff0c;OLED透明屏作为一种创新的显示技术&#xff0c;在各个行业中得到了广泛应用。 在进行OLED透明屏采购时&#xff0c;选择高质量的产品至关重要。在这篇文章中&#xff0c;尼伽将为您提供一个全面的OLED透明屏采购指南&#xff0c;帮助您了解关键步…

day20 飞机大战射击游戏

有飞行物类 飞行 爆炸 的连环画&#xff0c; 飞行的背景图 &#xff0c; 子弹图&#xff0c; 还有游戏开始 暂停 结束 的画面图。 设计一个飞机大战的小游戏&#xff0c; 玩家用鼠标操作hero飞行机&#xff0c; 射出子弹杀死敌机&#xff0c;小蜜蜂。 敌机可以获得分数&…

Jmeter参数化类型

1.参数在多个请求报文中出现&#xff0c;执行一次需要使用同一个参数--随机生成(随机变更) 2.参数在请求报文中出现&#xff0c;执行过程需要使用同一个参数(--固定参数) 3.参数从指定几个固定中随机获取一个 4.参数从本地文件中获取 5.参数在多个请求报文中出现&#xff0c;每…

计算机 数进制转换;存储MB与带宽Mbps

参考&#xff1a;https://zhuanlan.zhihu.com/p/459817484 1、计算机 数进制转换 1&#xff09;与十进制相关的转换 2&#xff09;与二进制相关的转换 二进制是Binary&#xff0c;简写为B&#xff1b;八进制是Octal&#xff0c;简写为O&#xff1b;十进制是Decimal&#xff…

还在玩传统终端,不妨来试试全新 AI 终端 Warp

壹 ❀ 引 最近一段时间&#xff0c;AI领域如同雨后春笋般开始猛烈生长&#xff0c;processon&#xff0c;sentry&#xff0c;一些日常使用的工具都在积极接入AI&#xff0c;那么正好借着AI的风头&#xff0c;今天给大家推荐一款非常不错的智能终端 warp&#xff08;目前仅限ma…

车载APP软件外包开发通讯

车载APP与车辆之间的通信方式和特点会因为不同的技术和场景而有所不同。以下是一些常见的车载APP与车辆通信方式以及它们的特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.蓝牙连接&#xff1a…

STM32 F103C8T6学习笔记9:0.96寸单色OLED显示屏—自由取模显示—显示汉字与图片

今日学习0.96寸单色OLED显示屏的自由取模显示: 宋体汉字比较复杂&#xff0c;常用字符可以直接复制存下来&#xff0c;毕竟只有那么几十个字母字符&#xff0c;但汉字实在太多了&#xff0c;基本不会全部放在单片机里存着&#xff0c;一般用到多少个字就取几个字的模&#xff…

hive高频使用的拼接函数及“避坑”

hive高频使用的拼接函数及“避坑” 说到拼接函数应用场景和使用频次还是非常高&#xff0c;比如一个员工在公司充当多个角色&#xff0c;我们在底层存数的时候往往是多行&#xff0c;但是应用的时候我们通常会只需要一行&#xff0c;角色字段进行拼接&#xff0c;这样join其他…

Transformer 相关模型的参数量计算

如何计算Transformer 相关模型的参数量呢&#xff1f; 先回忆一下Transformer模型论文《Attention is all your need》中的两个图。 设Transformer模型的层数为N&#xff0c;每个Transformer层主要由self-attention 和 Feed Forward组成。设self-attention模块的head个数为 …

linux系统部署jenkins详细教程

一、Linux环境 1、下载war包 官网下载地址&#xff1a; https://get.jenkins.io/war-stable/2.332.4/jenkins.war 2、将war包上传至服务器 创建目录/home/ubuntu/jenkins 上传war包至该目录 3、将jenkins添加到环境变量 进入环境变量文件 vim /etc/profile # 文件下方追加…

【3Ds Max】图形合并命令的简单使用

示例&#xff08;将文字设置在球体上&#xff09; 1. 首先这里创建一个球体和一个文本 2. 选中球体&#xff0c;在复合对象中点击图形合并按钮 点击“拾取图形”按钮&#xff0c;然后选中文本&#xff0c;此时可以看到球体上已经投射出文本 3. 接下来是一些常用参数的介绍 当…

从零实战SLAM-第八课(非特征点的视觉里程计)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…

centos下使用jemalloc解决Mysql内存泄漏问题

参考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的内存分配管理 &#xff08;2&#xff09;tcmalloc…

Django

一 django 安装 1. **安装 Django&#xff1a;** 首先&#xff0c;确保您已经安装了 Python 和 pip&#xff08;Python 包管理器&#xff09;。然后&#xff0c;在命令行中运行以下命令来安装 Django&#xff1a; bashpip install Django 2. **创建项目&#xff1a;** …

Electron-builder打包和自动更新

前言 文本主要讲述如何为 electron 打包出来软件配置安装引导和结合 github 的 release 配置自动更新。 electron-builder 是将 Electron 工程打包成相应平台的软件的工具&#xff0c;我的工程是使用 electron-vite 构建的&#xff0c;其默认集成了 electron-builder &#x…

中大型无人机远程VHF语音电台系统方案

方案背景 中大型无人机在执行飞行任务时&#xff0c;特别是在管制空域飞行时地面航管人员需要通过语音与无人机通信。按《无人驾驶航空器飞行管理暂行条例》规定&#xff0c;中大型无人机应当进行适航管理。物流无人机和载人eVTOL都将进行适航管理&#xff0c;所以无人机也要有…

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可…

Qt creator之对齐参考线——新增可视化缩进功能

Qt creator随着官方越来越重视&#xff0c;更新频率也在不断加快&#xff0c;今天无意中发现qt creator新版有了对齐参考线&#xff0c;也称可视化缩进Visualize Indent&#xff0c;默认为启用状态。 下图为旧版Qt Creator显示设置栏&#xff1a; 下图为新版本Qt Creator显示设…