【数据结构与算法】详解二叉树 上:理论篇——二叉树的基本概念与性质

news2024/12/25 16:03:14

             💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《数据结构与算法》

                                  期待您的关注

 

1b7335aca73b41609b7f05d1d366f476.gif​​

目录

 一、树的概念

🍃树的定义

🍃树的特点

🍃树的相关术语

二、二叉树的概念

🍃二叉树的定义

🍃二叉树的特点

🍃二叉树的分类

🍃二叉树的性质(重要)

三、二叉树的存储结构

🍃顺序结构

🍃链式结构

四、二叉树的应用场景


 

 一、树的概念

🍃树的定义

  1. 基本定义:树是一种抽象数据类型或数据结构,用于模拟具有树状结构性质的数据集合。它由n(n>0)个有限节点组成,这些节点之间具有层次关系。
  2. 结构特点:树的结构通常表现为根朝上、叶朝下,类似于一棵倒挂的树。每个节点可以有零个或多个子节点,但除了根节点外,每个节点都有且仅有一个父节点。

例如下图就是一棵树 

59a4265aa5524ee8b73c5f33c56bda25.png

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

f23839f67dc0486d9df7f870a5a07ed4.png

 

🍃树的特点

  1. 根节点:树中唯一没有父节点的节点,是整个树的起点。
  2. 子节点与父节点:每个节点可以有零个或多个子节点,而每个子节点都有一个父节点(除了根节点)。
  3. 叶节点:没有子节点的节点,也称为终端节点。
  4. 路径:两个节点之间通过边相连的序列,表示从一个节点到另一个节点的路线。
  5. 深度与高度:节点的深度是从根节点到该节点的边数;节点的高度是从该节点到最远叶节点的边数;树的高度是根节点的高度。
  6. 子树:一个节点及其所有后代节点构成的树。

 

🍃树的相关术语

  • :一个节点拥有的子树数。
  • 叶子节点:度为0的节点。
  • 根节点:树的起点,没有父节点。
  • 父节点与子节点:节点与其直接子节点之间的关系。
  • 兄弟节点:具有相同父节点的节点。
  • 树的度:树中节点度的最大值。

 

二、二叉树的概念

 

🍃二叉树的定义

二叉树(Binary Tree)是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。

 

🍃二叉树的特点

  1. :二叉树中每个节点的度最大为2(即最多有两个子节点)。
  2. 有序性:二叉树是有序的树,若将其左、右子树颠倒,则称为另一棵不同的二叉树。

 

任意的二叉树都是由以下五种情况构成的 

31568dc411d845a5b3e015a86b2b8803.png

 

🍃二叉树的分类

  1. 空二叉树:没有节点的二叉树称为空二叉树。
  2. 满二叉树:一棵深度为k的,且有2^k - 1个节点的二叉树称为满二叉树。
  3. 完全二叉树:深度为k的,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点一一对应时称之为完全二叉树。 

 

🍃二叉树的性质(重要)

  1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1)个结点.
  2.  若规定根结点的层数为1,则深度为h的二叉树的最大结点数是 2^h-1
  3.  对任何一棵二叉树, 如果度为0的叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有 n0= n2+1

 

三、二叉树的存储结构

 

🍃顺序结构

二叉树的顺序存储结构,又称为数组表示法,是用一组地址连续的存储单元依次存储二叉树中的节点元素。在顺序存储结构中,通常按照二叉树节点自上向下、自左向右的顺序存储。以下是关于二叉树顺序存储结构的详细解释:

 

  1. 存储方式
    • 使用一维数组来存储二叉树的节点。对于完全二叉树或满二叉树,节点的编号(或称为索引)与数组中的下标存在直接的对应关系。
  2. 完全二叉树与满二叉树的存储
    • 对于完全二叉树和满二叉树,节点的编号(从1开始)与数组中的下标(从0开始)之间的关系为:如果节点编号为i,则其在数组中的下标为i-1。
    • 例如,第一个节点的编号为1,其在数组中的下标为0;第二个节点的编号为2,其在数组中的下标为1,依此类推。
  3. 父子节点关系
    • 如果节点在数组中的下标为n(n从0开始),则其左子节点在数组中的下标为2n+1(如果存在的话);右子节点在数组中的下标为2n+2(如果存在的话)。
    • 父节点的下标可以由子节点的下标通过(n-1)/2计算得出(其中n为子节点在数组中的下标,结果向上取整)。
  4. 特点
    • 顺序存储结构通常只适用于完全二叉树和满二叉树,因为这样可以最大化地利用数组的空间,避免浪费。
    • 顺序存储结构可以快速地通过下标找到节点的父节点或子节点(如果存在的话)。
    • 对于非完全二叉树,使用顺序存储结构可能会导致空间浪费,因为数组中可能有很多位置是空的。
  5. 存储转换
    • 如果需要将一个普通的二叉树转换为顺序存储结构,通常需要先将其转换为完全二叉树或满二叉树。这可以通过给二叉树添加一些空的子节点来实现。

二叉树的顺序存储结构示意图如下

c899defd985f4dbaa4f46ac51dfa508f.png

二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

图中可以明显看到,对于非完全二叉树来说,顺序存储可能存在大量浪费空间的问题

 

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,

 

关于堆的内容单独写成了几篇文章对概念、实现与应用多个方面进行了讲解,参考下列文章

堆的概念及实现:

【数据结构与算法】探索数组在堆数据结构中的妙用:从原理到实现-CSDN博客

 

堆的应用:

【数据结构与算法】堆排序算法原理与实现:基于堆实现的高效排序算法-CSDN博客

【数据结构与算法】利用堆结构高效解决TopK问题-CSDN博客

 

 

🍃链式结构

二叉树的链式结构,即用链表来表示一棵二叉树,通过链表来指示元素之间的逻辑关系。二叉树的链式结构是一种灵活且高效的存储方式,它支持动态地插入和删除节点,适用于各种需要动态操作二叉树的场景。

 

一般我们所使用的二叉树都是用链式结构来实现的,这也是接下里要讲解的重点内容,不过篇幅所限,将会放在下一篇文章单独讲解

 

【数据结构与算法】详解二叉树下:实践篇-CSDN博客

 

 

四、二叉树的应用场景

二叉树的应用场景非常广泛,在计算机科学中扮演着重要的角色。以下是二叉树的主要应用场景,按领域进行分点表示和归纳:

 

  1. 数据库
    • 索引:在数据库中,二叉树(特别是其变种如B树和B+树)被广泛应用于实现索引。索引是一种用于加速数据库查询的数据结构。通过二叉树索引,每个节点都包含一个键值和指向左、右子树的指针,从而可以快速定位所需的数据。
  2. 编程语言
    • 语法树:在编程语言中,二叉树被用于解析和生成语法树。语法树是一种表示程序语法结构的树状结构,其中每个节点表示一个语法元素(如变量、运算符或函数调用)。通过构建语法树,编译器可以将源代码转换为可执行代码。
  3. 图形学
    • 几何图形表示:在图形学中,二叉树被用于构建几何图形的数据结构。例如,二叉树可以用于实现三角网格的分割和细分,其中每个节点表示一个三角形,而左、右子树分别表示三角形的左、右子三角形。
  4. 人工智能
    • 决策树:在人工智能中,二叉树被用于实现决策树。决策树是一种用于分类和预测的数据结构,其中每个节点表示一个属性(如年龄、性别或收入水平),通过比较属性值可以将数据集分成更小的子集。
    • 搜索树:搜索树(如二叉搜索树)是一种用于搜索最优解的数据结构。在搜索树中,每个节点表示一个状态(如一个棋盘上的局面),通过不断扩展搜索树可以找到最优的解决方案。
  5. 系统设计
    • 数据结构和算法:在系统设计中,二叉树被广泛应用于实现各种数据结构和算法。例如,二叉搜索树是一种用于快速查找和插入数据的数据结构,其时间复杂度为O(log n)。
  6. 搜索、排序和查找
    • 二叉搜索树:二叉搜索树是一种特殊的二叉树,其中每个节点的值大于左子树的所有节点的值,小于右子树的所有节点的值。通过二分查找算法,在二叉搜索树中可以快速定位目标值。
    • 二叉堆:二叉堆是一种用于实现优先队列的数据结构。它具有以下特点:任意节点的关键字值都小于(或大于)或等于其子节点的关键字值,根节点的关键字值最小(或最大)。二叉堆的插入和删除操作的时间复杂度为O(log n),适用于一些需要高效的优先级操作的场景,如任务调度。
  7. 表达式树
    • 数学表达式:二叉树可以用于存储和计算数学表达式。表达式树是一种二叉树,其叶节点是操作数,内部节点是操作符。通过遍历表达式树,可以递归地计算整个表达式的值。
  8. 文件系统
    • 文件和文件夹管理:二叉树可以用于组织和管理文件系统中的文件和文件夹。每个节点代表一个文件或文件夹,左子节点代表文件夹下的子文件夹,右子节点代表同一层级下的其他文件或文件夹。通过遍历二叉树,可以实现文件的查找、创建、删除等操作。
  9. 数据压缩
    • 哈夫曼树:哈夫曼树是一种常用的数据压缩算法,通过构建二叉树来实现。在哈夫曼树中,出现频率较高的字符对应的节点位于树的较低层,而出现频率较低的字符对应的节点位于树的较高层。通过对字符进行编码并使用相对较短的编码表示高频字符,可以实现对数据的高效压缩和解压缩。

这些只是二叉树应用场景的一部分示例,实际上二叉树在计算机科学和工程中的应用远不止这些

 

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

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

相关文章

Dify v0.6.9源码部署

一.前置条件 克隆Dify v0.6.9代码: git clone https://github.com/langgenius/dify.git在启用业务服务之前,需要先部署 PostgresSQL / Redis / Weaviate(如果本地没有的话),可以通过以下命令启动: cd do…

C#描述-计算机视觉OpenCV(5):直方图算法

C#描述-计算机视觉OpenCV(5):直方图算法 前文链接图像直方图灰度直方图的计算灰度直方图的绘制BGR三通道的直方图直方图的均衡化算法相似图像检测 前文链接 文中没提到的东西,很可能都在前文描述过 C#描述-计算机视觉OpenCV&…

[AI 大模型] OpenAI ChatGPT

文章目录 ChatGPT 简介ChatGPT 的模型架构ChatGPT的发展历史节点爆发元年AI伦理和安全 ChatGPT 新技术1. 技术进步2. 应用领域3. 代码示例4. 对话示例 ChatGPT 简介 ChatGPT 是由 OpenAI 开发的一个大型语言模型,基于GPT-4架构。它能够理解和生成自然语言文本&…

CentOS7安装、CentOS7修改root密码

目录 1 下载镜像 2 使用VMware新建一个虚拟机 3 centos7修改root密码 1 下载镜像 开源镜像站-阿里云centos-7.9.2009-isos-x86_64安装包是阿里云官方提供的开源镜像免费下载服务,每天下载量过亿,阿里巴巴开源镜像站为包含centos-7.9.2009-isos-x86_64安装包的几百个操作系统…

移动校园(2):express构建服务器,小程序调用接口,展示数据

express做服务器框架,mssql连接数据库,uni-request调用接口 这是文件夹目录 然后是index.js内容 const expressrequire(express) const appexpress() const uniRouterrequire("./uniRouter") const config{user:sa,password:123456,server:l…

汉中茗茶小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,茶叶管理,论坛管理,公告管理,茗茶历史管理 微信端账号功能包括:系统首页,茗茶信息&#xf…

正则表达式 先行断言 \S {} 示例

目录 数据准备一. 先行断言1.1 正向先行断言1.2 负向先行断言 二. 配合 {} 和 \S 使用2.1 匹配一个任意非空白字符2.2 匹配任意多个非空白字符2.3 匹配3个非空白字符2.4 匹配至少3个非空白字符2.5 匹配0~3个非空白字符 数据准备 ⏹文件1 0561-10 AAA 123 dfg 345 sss 0561-2…

2008-2021年各省份高技术产业科研与发展(RD)活动情况数据

R&D(研究与发展)活动是推动国家和公司技术创新和经济增长的关键因素。以下是对各省份高技术产业科研与发展(R&D)活动情况数据的介绍: 数据简介 定义:R&D指在产品开发、工艺设计、生产技术改进…

阿尔泰科技与西安交通大学陕西省某技术重点实验室共谋未来!

近日,阿尔泰科技的电子工程师(熊工)应邀前往西安交通大学陕西省某技术重点实验室,参与课题组项目的测试与调试工作。此次合作不仅成功推动了项目的进展,还为未来的深入合作奠定了坚实基础。 阿尔泰科技作为领先的测控技…

Flink SQL kafka连接器

版本说明 Flink和kafka的版本号有一定的匹配关系,操作成功的版本: Flink1.17.1kafka_2.12-3.3.1 添加kafka连接器依赖 将flink-sql-connector-kafka-1.17.1.jar上传到flink的lib目录下 下载flink-sql-connector-kafka连接器jar包 https://mvnreposi…

AI教你如何系统的学习Python

Python学习计划 第一阶段:Python基础(1-2个月) 目标:掌握Python的基本语法、数据类型、控制结构、函数、模块和包等。 学习Python基本语法:包括变量、数据类型(整数、浮点数、字符串、列表、元组、字典、…

Java求解百钱买百鸡问题(课堂实例2)

目录 💕💕引言💕💕 😍😍点关注编程梦想家(大学生版)-CSDN博客不迷路💕💕 一、问题背景----百鸡百钱_百度百科 (baidu.com) 𝑥𝑦&a…

颍川韩氏始祖,归顺大汉的弓高侯

弓高侯,听起来十分不顺当,像是域外来音似的。本人的名字更另类——颓当,词典中甚至找不到。然而,弓高曾经是河北的一个县名——弓高县,颓当曾经是匈奴的一个城——颓当城,这两个地名已经不存在了&#xff0…

python - 文件 / 永久存储:pickle / 异常处理

一.文件 利用help(open)可以看到open()函数的定义: >>> help(open) Help on built-in function open in module _io:open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 默认打开模式是’rt’&#xff0…

spring boot(学习笔记第十二课)

spring boot(学习笔记第十二课) Spring Security内存认证&#xff0c;自定义认证表单 学习内容&#xff1a; Spring Security内存认证自定义认证表单 1. Spring Security内存认证 首先开始最简单的模式&#xff0c;内存认证。 加入spring security的依赖。<dependency>…

edge浏览器详细解析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 Microsoft Edge ​​​​…

InvalidVersionSpecError: Invalid version spec: =2.7解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

C++ | Leetcode C++题解之第22题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countNodes(TreeNode* root) {if (root nullptr) {return 0;}int level 0;TreeNode* node root;while (node->left ! nullptr) {level;node node->left;}int low 1 << level, high (1 <&…

详解Java垃圾回收(GC)机制

一、为什么需要垃圾回收 如果不进行垃圾回收&#xff0c;内存迟早都会被消耗空&#xff0c;因为我们在不断的分配内存空间而不进行回收。除非内存无限大&#xff0c;我们可以任性的分配而不回收&#xff0c;但是事实并非如此。所以&#xff0c;垃圾回收是必须的。 二、哪些内…

计算机的错误计算(二十四)

摘要 计算机的错误计算&#xff08;二十一&#xff09;就案例 展示了“两个不相等数相减&#xff0c;差为0”。本节给出新的计算过程&#xff1a;不停增加计算精度直到出现非0结果。这个过程与结果表明&#xff0c;即使是专业数学软件&#xff0c;对这个问题的处理&#xff0…