【数据结构】5.4 二叉树的性质和存储结构

news2025/1/15 23:42:17

二叉树的性质

性质1

  • 在二叉树的第 i 层上至多2 i-1 个结点(i >= 1)。

在这里插入图片描述

  • 证明:利用归纳法证明此性质。

在这里插入图片描述

  • 第 i 层上至少也应该有 1 个结点,如果是 0 个结点的话那就没有这一层了。

性质2

  • 深度为 k (这棵二叉树有k层)的二叉树至多2k - 1 个结点(k >= 1)。
  • 证明:由性质 1 可知,深度为 k 的二叉树的最大结点数为:将每一层的结点全部加起来。

在这里插入图片描述

  • 深度为 k 的二叉树至少有 k 个结点,每层至少得有1个结点。

在这里插入图片描述

性质3

  • 对任何一个二叉树 T ,如果其终端结点数(叶子数)为 n0,度为2的结点树为 n2,则 n0 = n₂ + 1
  • 如:下图有7 8 9 10 11 12这 6 个叶子结点,度为 2(有2个分支)的结点则有12345 这5个,所以叶子结点的数量 = 度为2的结点数+1,6=5+1
    在这里插入图片描述
  • 证明
    • 从下往上看:所有的结点都和它的双亲有一条边连着(除了根结点),设B为分支总数,所以分支总是=结点总数-根结点B = n - 1
    • 从上往下看:每个度为2的结点都会产生两条边,度为1的结点则产生1条边,剩余的叶子结点因为没有分支,所以不产生边,所以总边数为:度为2的结点数2+度为1的结点1,B = n₂ * 2 + n₁ * 1
    • 同一棵二叉树的边的个数应该是相等的,所以,不管从上往下看还是从下往上看的结果应该相等

在这里插入图片描述

满二叉树和完全二叉树

这两种二叉树在顺序存储的方式下可以复原!

满二叉树

一颗深度为 k 且含有 2 k-1个结点的二叉树称为满二叉树,顾名思义,一个二叉树中的所有结点都存在。
如:这棵满二叉树就有 2 4-1 = 15个结点

在这里插入图片描述

特点

  1. 每一层上的结点树都是最大结点数(每层都满)。
  2. 叶子结点全部在最底层

对满二叉树结点位置进行编号

  • 编号规则:从根结点开始,自上而下,自左而右
  • 每一个结点位置都存放有元素。

在这里插入图片描述

完全二叉树

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

深度为 K 的具有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树编号
为 1~n的结点一一对应时,称之为完全二叉树

如:下图的 完全二叉树 的 全部编号 都能在 满二叉树 当中找到,编号123456的位置,都能在满二叉树的对应位置上找到。

在这里插入图片描述

非完全二叉树

非完全二叉树就不是所有的编号都能在满二叉树对应的位置上找到了。如下图:非完全二叉树编号为6的结点就不能再满二叉树中编号为6的位置上找到了。

在这里插入图片描述

判断下图中的二叉树是否是完全二叉树

在这里插入图片描述

更好的完全二叉树判别方法

  • 在满二叉树中,从最后一个结点开始,连续去掉任意个结点,即是一颗完全二叉树,一定是连续的去掉

在这里插入图片描述

完全二叉树的特点

  1. 叶子只可能分布在层次最大的两层上(叶子只会在最后1层或导数第二层)。
  2. 对任一结点,如果其右子树的最大层次为 i ,则其左子树的最大层次必为 i 或 i + 1.

在这里插入图片描述

完全二叉树的性质

性质4

在这里插入图片描述
在这里插入图片描述

证明

在这里插入图片描述

性质5

如果对一棵有 n 个结点的完全二叉树(深度为𠃊log₂n𠃎 + 1)的结点按层序编号(从第一层到𠃊log₂n𠃎 + 1层,每层从左到右),则队==任一结点 i ==(1 <= i <= n),有:

  1. 如果 i = 1,则结点 i 是二叉树的根,无双亲;如果 i > 1,则其==双亲是结点𠃊 i / 2 𠃎 ==。
  2. 如果 2i > n,则结点 i 为叶子结点,无左孩子了否则,其左孩子是结点 2i
  3. 如果 2i + 1 > n,则结点 i 无右孩子;否则其右孩子是结点 2i + 1

在这里插入图片描述

性质5表明了完全二叉树中双亲结点编号与-孩子结点编号之间的关系

在这里插入图片描述

二叉树的存储结构

在这里插入图片描述

二叉树的顺序存储结构

实现

  • 按照满二叉树的结点层次编号,依次存放二叉树中的数据元素。
  • 每个结点的编号就作为数组的下标,根据结点编号存放在数组中。
  • 如:根节点的编号就是 0,然后按照自上而下,自左而右的顺序依次排号。

在这里插入图片描述

类型定义

定义一个最大空间为100字节的数组,

在这里插入图片描述

如果有一棵如下图所示的二叉树,该如何存储?

在这里插入图片描述

  • 依然是按照满二叉树的方式排号,那些没有元素的结点也要空出来,将这些没有元素的空结点在数组中就以 0 的形式存储。
  • 如果不这样存,而是以 abcdefg 的形式存储,那这不就成了满二叉树了嘛。

在这里插入图片描述

【例】:二叉树结点数值采用顺序存储结构,如图所示,画出二叉树。

在这里插入图片描述

只要知道一颗满二叉树的编号是多少,然后将对应位置的结点扣掉就行了。

在这里插入图片描述

二叉树的顺序存储缺点

  • 顺序存储共有的一个缺点就是存储元素的数组大小是固定的。
  • 加入树中的元素个数变化很大时,这时还用定长的数组存储就不够灵活了。
  • 当树中有空结点的时候,这些空结点依然要占用数组的空间,浪费空间。

最坏的情况就如下图所示,这样一棵右单支树的空间利用率就相当低了,为了存储这样一棵树,需要7个元素的数组。右单支树的层数越高,越浪费空间

在这里插入图片描述

二叉树顺序存储的特点

  • 结点空间关系蕴含在其存储位置中。
  • 浪费空间,适合于存储满二叉树和完全二叉树

二叉树的链式存储结构

  • 由二叉树的定义可知,二叉树的结点由一个数据元素和分别指向其左、右子树的两个分支构成。

在这里插入图片描述

  • 则表示二叉树的链表中的结点至少包含三个域:数据域和左、右指针域,左、右指针分别指向左、右孩子,如果要经常操作结点的左右孩子,就使用这种存储结构。

在这里插入图片描述
含有两个指针域的结点结构的定义在这里插入图片描述

二叉链表

  • 二叉链表有两个指针域,一个指向左孩子,另一个指向右孩子。
  • 用一个头指针指向整棵二叉树的根结点 A,
  • 没有孩子的那一边的指针域置为 NULL。
    • 如:A 结点没有右孩子,所以将A结点的右指针域置为NULL,其他结点同理。

在这里插入图片描述

单支树的二叉链表

  • 每个结点都只有左或右孩子二叉树称为单支树,同理这样的链表就称为单支树的二叉链表。
    • 如:左单支树的二叉链表,因为每个结点都没有右孩子,所以每个结点的右指针域都为NULL,

在这里插入图片描述

总结规律

在这里插入图片描述

  • 在有 n 个结点的二叉链表中,有 n + 1个空指针域。
  • 分析:必定有 2n 个链域。
    • 除根节点之外,每个结点有且仅有一个双亲,所以只会有 n - 1个结点的链域用来存放指针,指向非空子女结点。

三叉链表

  • 有时,为了便于找到结点的双亲,还可以在结点结构中增加一个指向其双亲结点的指针域。
  • 和二叉链表有两个指针域类似,有三个指针域的链表称为三叉链表,分别指向左、右孩子,以及双亲

在这里插入图片描述
在这里插入图片描述

只有根结点的双亲域为空,其余结点一定会有双亲。

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

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

相关文章

java static 关键字

目录 一、前言 二、用途和效果 2.1. static修饰的范围 2.2.执行特点 2.3.static关键字的用途 三. 注意 static关键字误区: 一、前言 在我们学习java中会碰到许多关键字 , 例如: static、final、 transient、instanceof、break 、continue 等其他的关键字&#xff0c;今天…

CBM|用于lncRNA-疾病关联预测的数据资源和计算方法(综述)

CBM|用于lncRNA-疾病关联预测的数据资源和计算方法&#xff08;综述&#xff09; 最近搞了个公众号《AI and Bioinformatics》介绍应用于生物信息学的人工智能算法和研究进展&#xff0c;以及网络表示学习算法研究&#xff0c;欢迎向本公众号投稿文献解读类原创文章&#xff0…

11_7、Java集合之Collections工具类的使用

一、作用是操作Collection和Map的集合操作类。二、常用方法1、排序操作&#xff1a;&#xff08;均为static方法&#xff09;reverse(List)&#xff1a;反转 List 中元素的顺序shuffle(List)&#xff1a;对 List 集合元素进行随机排序sort(List)&#xff1a;根据元素的自然顺序…

20.04安装carla0.9.13记录

已经多次在不同版本的系统18.04、20.04安装carla不同源码版本0.9.11&#xff0c;0.9.12&#xff0c;0.9.13了&#xff0c;发现每次安装总是会遇到那么几个问题&#xff0c;现在新配了主机又要重新安装carla&#xff0c;这次准备详细的记录一下&#xff0c;方便未来安装时又遇到…

共享单车蓝牙锁方案phy6222系列蓝牙芯片

公共交通工具的"最后一公里"是城市居民出行采用公共交通出行的主要障碍&#xff0c;也是建设绿色城市、低碳城市过程中面临的主要挑战。随着科技的发展&#xff0c;物联网领域市场的不断开拓BLE协议在共享交通工具上打开了突破口&#xff0c;目前已广泛应用及遍布我们…

更换服务器的笔记

文章目录背景问题汇总服务器 git 的建立Q: 启动的服务连不上背景 最近阿里云的服务器到期了&#xff0c;但是续费实在是太贵了 之前是嫌麻烦&#xff0c;然后续费还挺便宜的&#xff0c;所以就没折腾去换服务器 这回续费一个月就小一百&#xff0c; 吃不消了&#xff0c;不得…

【论文简述】DPSNet End-to-end Deep Plane Sweep Stereo(ICLR 2019)

一、论文简述 1. 第一作者&#xff1a;Sunghoon Im 2. 发表年份&#xff1a;2019 3. 发表期刊&#xff1a;ICLR 4. 关键词&#xff1a;MVS、深度学习、端到端、代价体、代价聚合 5. 探索动机&#xff1a;双目立体匹配无法扩展到多视图&#xff0c;平面扫描方法无法进行端…

基于python pyotrch开发的垃圾分类程序,含数据集,基于深度学习的垃圾分类程序

基于python的垃圾分类程序&#xff0c;提供数据集&#xff08;pytorch开发&#xff09; 完整代码下载地址&#xff1a;基于python pyotrch开发的垃圾分类程序&#xff0c;含数据集 垃圾分类是目前社会的一个热点&#xff0c;分类的任务是计算机视觉任务中的基础任务&#xf…

Qt进度条详解以及format显示格式

进度条的步进值 设置好进度条的最大值和最小值&#xff0c;进度条将会显示完成的步进值占总的步进值的百分比&#xff0c;百分比的计算公式为&#xff1a;百分比 (value() - minimum()) / (maximum() - minimum()) 部分函数含义 QProgressBar&#xff1a;横向或纵向显示进度的…

前端必备:五大css自动化生成网站(稀有级别!)

粉丝朋友们大家好&#xff0c;我是你们的 csdn的博主&#xff1a;lqj_本人 哔哩哔哩&#xff1a;小淼前端 另外&#xff0c;大家也可以关注我的哔哩哔哩账号&#xff0c;我会不定时的发布一些有关于全栈云开发以及前端开发的详解视频源码 1.微信小程序腾讯云开发之学生端收集数…

8.3K Star,这才是我们苦苦寻找的PDF阅读器。。。

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store 无论是在大学期间&#xff0c;还是工作之后都很难绕开PDF软件。 比如看个论文、课件、演示文档…经常会用到PDF。 大学期间我是一个特别爱折腾各种各样电子产品、数码、软件、操作系统&#xff0c;曾…

囿于数据少?泛化性差?PaddleDetection少样本迁移学习助你一键突围!

目标检测是非常基础和重要的计算机视觉任务&#xff0c;在各行业有非常广泛的应用。然而&#xff0c;在很多领域的实际落地过程中&#xff0c;由于样本稀缺、标注成本高或业务冷启动等困难&#xff0c;难以训练出可靠的模型。 在目标检测这类较为复杂的学习任务上&#xff0c;样…

2023年跨境电商依然是风口,如何做好跨境电商

2023年1月1日&#xff0c;《区域全面经济伙伴关系协定》(RCEP)正式签署生效一周年&#xff0c;(rcep)于2023年1月2日起&#xff0c;RCEP对印度尼西亚正式生效&#xff0c;至此&#xff0c;我国已与其他14个rcep成员中的13个相互实施协定。这预示着&#xff0c;东南亚市场必将成…

下拉控件无法选中

本文迁移自本人网易博客&#xff0c;写于2012年1月9日&#xff0c;二维多段线绘制 - lysygyy的日志 - 网易博客 (163.com)做符号化过程中&#xff0c;一开始发现控件下拉后导致死机&#xff0c;原来是资源切换的问题&#xff0c;使用CAcModuleResourceOverride resOverride;即可…

Cadence PCB仿真使用Allegro PCB SI配置电压地网络电压的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,配置方法3,总结1,概述 本文简单介绍使用Allegro PCB SI软件配置电压地网络电压的方法。 2,配置方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PCB SI则可这样…

C++连接mysql数据库并读取数据

1、需要包含mysql API的头文件 如果需要连接都本地的mysql数据库&#xff0c;前提是本地要已经安装了mysql数据库。这里要用到一些mysql的API&#xff0c;比如连接数据库、执行查询语句等操作&#xff0c;这些接口都包含在下面的头文件中&#xff1a; #include <mysql/mys…

kubernetes部署nacos集群(防坑)

kubernetes部署nacos集群&#xff08;防坑&#xff09; 官方nacos集群yaml文档参考&#xff1a; https://github.com/nacos-group/nacos-k8s.git 一、nacos 概览 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态…

VUE3中,使用Axios

axios是前后端数据交互的重要桥梁&#xff0c;理论和概念这里不再叙述了。可以看看官网。 axios中文文档|axios中文网 | axios 本例子&#xff0c;从简单到难。 目录 一、简单的使用 二、查询数据时出现等待窗体 一、简单的使用 1.废话少说&#xff0c;先使用HBuilder X建…

【测试】软件测试基本概念

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录1. 什么是需求2.什么是测试用例&#xff1f;3. 软件错误Bug的概念:sparkles:小结普通小孩也要热爱生活&#xff01; 1. 什么是需求 【注】一旦提及“区别”&#xff0c;一定要回答 相同点不同点。 在企业中&#x…

算法刷题打卡第57天:合并两个有序链表

合并两个有序链表 难度&#xff1a;简单 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#x…