一文了解二叉树的基本概念

文章目录

    • 二叉树
      • 1二叉树的定义及其主要特征
        • 1.1二叉树的定义
        • 1.2二叉树的特点
        • 1.3二叉树的五种形态
        • 1.4二叉树与度为2的有序树的区别
        • 1.5几个特殊的二叉树
        • 1.6二叉树的性质
      • 2二叉树的存储结构
        • 2.1二叉树的顺序存储
        • 2.2二叉树的链式存储

二叉树

请添加图片描述



1二叉树的定义及其主要特征


1.1二叉树的定义

​ 二叉树是 n(n≥0)个结点的有限集合

​ (1)或者为空二叉树,即 n = 0

​ (2)或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。


1.2二叉树的特点

​ (1)每个结点至多只有两棵子树;

​ (2)左右子树不能颠倒(二叉树是有序树),因此,二叉树有五种基本形态


1.3二叉树的五种形态

请添加图片描述


1.4二叉树与度为2的有序树的区别

​ (1)度为 2 的树至少有 3 个结点,而二叉树可以为空

​ (2)度为 2 的有序树的孩子的左右次序是相对于另一孩子而言的,若某个结点只有一个孩子,则这个孩子就无须区分其左右次序;而二叉树无论其孩子数是否为 2,均需确定其左右次序,即二叉树的结点次序不是相对于另一结点而言,而是确定的。


1.5几个特殊的二叉树

1.满二叉树

​ 一棵深度为 k,且有2k − 1 个结点的二叉树称为满二叉树(Full Binary Tree)。它的特点是每一层上的结点数都达到了最大,即对给定的高度,它是具有最多结点数的二叉树。满二叉树中不存在度为 1 的结点(除叶子结点之外的每个结点度数均为 2),每个分支结点均有两棵高度相同的子树,且所有叶子都在最下一层上。

请添加图片描述

​ 可以对满二叉树按层序编号:约定编号从根结点(根结点编号为 1)起,自上而下,自左向右。这样,每个结点对应一个编号,对于编号为 i 的结点,若有双亲,则其双亲为⌊ i/2 ⌋ ,若有左孩子,则左孩子为 2i;若有右孩子,则右孩子为 2i+1。

2.完全二叉树

​ 如果深度为 k,有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树中编号从 1 到 n 的结点一一对应,则该二叉树称为完全二叉树,其特点如下:

​ (1)若 i≤⌊ n/2 ⌋ ,则结点 i 为分支结点,否则为叶子结点

​ (2)叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。

​ (3)若有度为 1 的结点,则只可能有一个,且该结点只有左孩子而无右孩子(重要特征)。

​ (4)按层序编号后,一旦出现某结点(编号为 i)为叶子结点或只有左孩子,则编号大于 i 的结点均为叶子结点。

​ (5)若 n 为奇数,则每个分支结点都有左孩子和右孩子;若 n 为偶数,则编号最大的分支结点(编号为 n/2)只有左孩子,没有右孩子,其余分支结点左、右孩子都有。

3.二叉排序树

​ 二叉排序树或者是空二叉树,或者是具有如下性质的二叉树:

​ (1)左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字。

​ (2)左子树和右子树又各是一棵二叉排序树。

4.平衡二叉树

​ 平衡二叉树上任一结点的左子树和右子树的深度之差不超过 1。

1.6二叉树的性质

​ 因为二叉树也是一棵树,所以二叉树的性质是树的性质的一种特殊情况。

1.二叉树性质 1

​ 设非空二叉树中,度为 0、1 和 2 的结点个数分别为n0、n1和n2,则n0=n2+1(叶子结点比二分支结点多一个)。

2.二叉树性质 2

​ 二叉树第 i 层至多有2 i−1个结点(i≥1);m 叉树第 i 层至多有mi−1个结点(i≥1)。

3.二叉树性质 3

​ 高度为 h 的 m 叉树至多有(mh -1)/(m-1)个结点(h≥1);高度为 h 的二叉树至多有2 h -1 个结点。

4.二叉树性质 4

​ 具有 n(n>0)个结点的完全二叉树的深度为⌊ log2 n ⌋ + 1 或⌈ log2 (n + 1) ⌉ 。

5.二叉树性质 5

​ 如果对一棵有 n 个结点的完全二叉树(其深度为⌊ log2 n ⌋ + 1)的结点按层序编号(从第 1 层到⌊ log2 n ⌋ + 1 层,每层从左到右),则对任一结点 i(1≤i≤n),有:

​ (1)若 i=1,则结点 i 是二叉树的根,无双亲;若 i>1,则其双亲是结点 ⌊ i/2 ⌋ 。

​ (2)若 2i>n,则结点 i 无左孩子(结点 i 为叶子结点);否则其左孩子是结点 2i。完全二叉树中的结点若无左孩子,则肯定也无右孩子,即为叶子,故编号 i>⌊ n/2 ⌋ 的结点必定是叶子。

​ (3)若 2i+1>n,则结点 i 无右孩子,否则其右孩子为结点 2i+1。

​ (4)结点 i 所在层次(深度)为⌊ log2 n ⌋ +1。



2二叉树的存储结构


2.1二叉树的顺序存储

(1)二叉树的顺序存储

​ 定义一个长度为 MaxSize 的数组 t,按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点。满二叉树和完全二叉树最适合这种存储方式。其他的二叉树一定要把二叉树的结点编号与完全二叉树对应起来。

​ 此外,这种存储方式建议从数组下标 1 开始存储,否则在使用二叉树的性质时可能出错。

请添加图片描述

(2)二叉树顺序存储的部分性质

i 的左孩子2i
i 的右孩子2i+1
i 的父节点⌊ i/2 ⌋
i 所在的层次⌈ log2 (n + 1) ⌉ 或 ⌊ log2 n ⌋ + 1

(3)有 n 个结点的完全二叉树的部分判断条件

判断 i 是否有左孩子?2i≤n?
判断 i 是否有右孩子?2i+1≤n?
判断 i 否是叶子/分支结点?i> ⌊ n/2 ⌋ ?

2.2二叉树的链式存储

​ 对于一般的二叉树,通常采用链式存储方式。二叉树中每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域的链式结点结构是很自然的想法。

1.二叉链表

​ 在二叉树中,结点结构通常包括若干数据域和若干指针域,而二叉链表至少包含 3 个域:数据域 data 左指针域 lchild 和右指针域 rchild。

//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType data; 						//数据域struct BiTNode *lchild,*rchild; 	//左、右孩子指针
}BiTNode,*BiTree;

请添加图片描述

​ 显然,在含有 n 个结点的二叉链表中,含有 n+1 个空链域(重要结论,选择题经常出现)。这是因为,每个叶结点有 2 个空指针,每个度为 1 的结点有 1 个空指针,所以总共有 2n0+n1个空指针。

又由二叉树的性质 1 可知,n0=n2+1,而二叉树中,n=n0+n1+n2,所以二叉链表中的空指针总数为2n0+n1=n0+n0+n1=n2+1+n0+n1=n+1。这些空链域可以用来组成后面我们会提到的另一种链表结构:线索链表

2.三叉链表

​ 相较于二叉链表,三叉链表增加了一个指向其父节点的指针,可以更加方便地找到结点的父节点。

typedef struct TriTNode{ElemType data; 						//数据域struct TriTNode *Lchild,*rchild; 	//左、右孩子指针struct TriTNode *parent; 			//父节点指针
}TriTNode,*TriTree;

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

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

相关文章

MAX98357A一款数字脉冲编码调制(PCM)输入D类音频功率放大器

MAX98357A是一款数字脉冲编码调制(PCM)输入D类音频功率放大器,以下是对其的详细介绍: 一、主要特性 音频性能: 提供D类效率与AB类音频性能。支持高达3.2W(4Ω负载,5V供电)的输出功率…

nacos(基于docker最详细安装)

1、什么是Spring Cloud Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。…

78,【2】BUUCTF WEB .[安洵杯 2019]不是文件

进入靶场 解题过程 点击最下面的英文字即可上传图片 新建一个文本文档 里面内容为空 更改名字为 1,2,3,4,0x4f3a363a2268656c706572223a323a7b733a393a22002a00696676696577223b623a313b733a393a22002a00636f6e666967223b733a353a222f666c6167223b7d)#.png 知道id1&#x…

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景:我想把旧仓库迁移新仓库中,放进去之后,新仓库会显示这个项目之前的所有提交,如何不显示这些旧的提交? 二、原因 我们需要将旧仓库迁移新仓库中,但是又不想在新仓库中显示旧的提交记录…

Mysql索引(学习自用)

目录 一、索引概述 优缺点 二、索引结构 1、索引数据结构 2、索引支持结构 3、B树 4、B树 5、hash索引 6、为啥采用B树索引 三、索引分类 四、索引语法 五、索引性能分析 5.1查看执行频率 5.2慢查询日志 5.3profiling 5.4explain 六、索引使用规则 6.1验证索…

PSD是什么图像格式?如何把PSD转为JPG格式?

在图形设计的世界里,Photoshop 文档(PSD)格式是 Adobe Photoshop 的原生文件格式,它允许设计师保存图像中的图层、蒙版、透明度和不同色彩模式等信息。对于需要进一步编辑的设计作品来说,PSD 文件提供了极大的灵活性。…

基于物联网的风机故障检测装置的设计与实现

1 系统总体设计方案 通过对风机故障检测装置的设计与实现的需求、可行性进行分析,本设计风机故障检测装置的设计与实现的系统总体架构设计如图2-1所示,系统风机故障检测装置采用STM32F103单片机作为控制器,并通过DS18B20温度传感器、ACS712电…

全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析

本文介绍了我在 DOCA 开发环境下对 DPU 进行测评和计算能力测试的一些真实体验和记录。在测评过程中,我主要关注了 DPU 在高并发数据传输和深度学习场景下的表现,以及基本的系统性能指标,包括 CPU 计算、内存带宽、多线程/多进程能力和 I/O 性…

websocket实现

由于安卓资源管理器展示的路径不尽相同,各种软件保存文件的位置也不一定一样.对于普通用户上传文件时,查找文件可能是一个麻烦的事情.后来想到了一个办法,使用pc端进行辅助上传. 文章目录 实现思路1.0 实现定义web与客户端通信数据类型和数据格式web端websocket实现web端对客户…

【科研建模】Pycaret自动机器学习框架使用流程及多分类项目实战案例详解

Pycaret自动机器学习框架使用流程及项目实战案例详解 1 Pycaret介绍2 安装及版本需求3 Pycaret自动机器学习框架使用流程3.1 Setup3.2 Compare Models3.3 Analyze Model3.4 Prediction3.5 Save Model4 多分类项目实战案例详解4.1 ✅ Setup4.2 ✅ Compare Models4.3 ✅ Experime…

CY T 4 BB 5 CEB Q 1 A EE GS MCAL配置 - MCU组件

1、ResourceM 配置 选择芯片信号: 2、MCU 配置 2.1 General配置 1) McuDevErrorDetect: - 启用或禁用MCU驱动程序模块的开发错误通知功能。 - 注意:采用DET错误检测机制作为安全机制(故障检测)时,不能禁用开发错误检测。2) McuGetRamStateApi - enable/disable th…

docker 安装 mysql 详解

在平常的开发工作中,我们经常需要用到 mysql 数据库。那么在docker容器中,应该怎么安装mysql数据库呢。简单来说,第一步:拉取镜像;第二步:创建挂载目录并设置 my.conf;第三步:启动容…

【2025年数学建模美赛E题】(农业生态系统)完整解析+模型代码+论文

生态共生与数值模拟:生态系统模型的物种种群动态研究 摘要1Introduction1.1Problem Background1.2Restatement of the Problem1.3Our Work 2 Assumptions and Justifications3 Notations4 模型的建立与求解4.1 农业生态系统模型的建立与求解4.1.1 模型建立4.1.2求解…

编码器和扩散模型

目录 摘要abstract1.自动编码器2.变分编码器(VAE)3.论文阅读3.1 介绍3.2 方法3.3 结论 4.总结参考文献 摘要 本周学习了自动编码器(AE)和变分自动编码器(VAE)的基本原理与实现,分析其在数据降维…

【C++】类与对象初级应用篇:打造自定义日期类与日期计算器(2w5k字长文附源码)

文章目录 一、日期类的实现1. 日期类的默认成员函数的分析与实现构造函数其它默认成员函数 2. 各种逻辑比较运算符重载3. 日期加与减天数日期加天数系列日期减天数系列日期加减天数的最后修定和- -系列 4. 日期减日期方法一方法二 5. 流插入与流提取重载流插入重载流提取重载(含…

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时,除了默认的IndexController能访问,其他路由Controller都访问不到,提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录(或子目录)中需要…

2013年蓝桥杯第四届CC++大学B组真题及代码

目录 1A:高斯日记(日期计算) 2B:马虎的算式(暴力模拟) 3C:第39级台阶(dfs或dp) 4D:黄金连分数(递推大数运算) 5E:前缀…

【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标!说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站点…

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 算法Journey 🏠 第N个泰波那契数模型 📌 题目解析 第N个泰波那契数 题目要求的是泰波那契数,并非斐波那契数。 &…