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

news/2024/7/17 23:11:22 标签: 数据结构, 二叉树

             💓 博客主页:倔强的石头的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. 系统设计
  6. 搜索、排序和查找
    • 二叉搜索树:二叉搜索树是一种特殊的二叉树,其中每个节点的值大于左子树的所有节点的值,小于右子树的所有节点的值。通过二分查找算法,在二叉搜索树中可以快速定位目标值。
    • 二叉堆:二叉堆是一种用于实现优先队列的数据结构。它具有以下特点:任意节点的关键字值都小于(或大于)或等于其子节点的关键字值,根节点的关键字值最小(或最大)。二叉堆的插入和删除操作的时间复杂度为O(log n),适用于一些需要高效的优先级操作的场景,如任务调度。
  7. 表达式树
    • 数学表达式二叉树可以用于存储和计算数学表达式。表达式树是一种二叉树,其叶节点是操作数,内部节点是操作符。通过遍历表达式树,可以递归地计算整个表达式的值。
  8. 文件系统
    • 文件和文件夹管理二叉树可以用于组织和管理文件系统中的文件和文件夹。每个节点代表一个文件或文件夹,左子节点代表文件夹下的子文件夹,右子节点代表同一层级下的其他文件或文件夹。通过遍历二叉树,可以实现文件的查找、创建、删除等操作。
  9. 数据压缩
    • 哈夫曼树:哈夫曼树是一种常用的数据压缩算法,通过构建二叉树来实现。在哈夫曼树中,出现频率较高的字符对应的节点位于树的较低层,而出现频率较低的字符对应的节点位于树的较高层。通过对字符进行编码并使用相对较短的编码表示高频字符,可以实现对数据的高效压缩和解压缩。

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

 


http://www.niftyadmin.cn/n/5543940.html

相关文章

LabVIEW的JKI State Machine

JKI State Machine是一种广泛使用的LabVIEW架构,由JKI公司开发。这种状态机架构在LabVIEW中提供了灵活、可扩展和高效的编程模式,适用于各种复杂的应用场景。JKI State Machine通过状态的定义和切换,实现了程序逻辑的清晰组织和管理&#xff…

Vue的学习之事件处理(一)

目录 一、事件处理方法 二、内联处理器的方法 一、事件处理方法 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的学习</title><script src"vue.js" type"text/javascript" charset&q…

`THREE.Line` 是 Three.js 中用于创建线段的类。

demo案例 THREE.Line 是 Three.js 中用于创建线段的类。以下是 THREE.Line 的详细说明&#xff0c;包括构造函数参数、输出、方法和属性。 构造函数 new THREE.Line(geometry, material, mode) geometry (THREE.BufferGeometry 或 THREE.Geometry): 定义线段的几何体。mater…

Python面试题:请解释什么是鸭子类型(duck typing)?

鸭子类型&#xff08;Duck Typing&#xff09;是一种动态类型语言中的概念&#xff0c;它基于对象的行为&#xff08;方法和属性&#xff09;而不是其实际类型进行判断。这个概念源自詹姆斯惠特科姆赖利的谚语&#xff1a; “如果它走起来像鸭子&#xff0c;叫起来像鸭子&#…

VBA之Word应用第二章第七节:利用自定义函数修改书签

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…

java树状结构 list 如何判断是第几级

解决方案 算法思路 为了判断树状结构中的列表是第几级&#xff0c;我们可以采用递归的方式遍历每个节点&#xff0c;计算其深度。具体来说&#xff0c;对于每个节点&#xff0c;我们可以向上遍历其父节点&#xff0c;直到根节点&#xff0c;同时累计深度值。最终得到的深度值就…

Vue3快速上手--3小时掌握

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core截止2023年10月&#xff0c;最新的…

一年时间业绩增长2倍,茅台保健酒业公司在川销售的“三板斧”

执笔 | 尼 奥 编辑 | 扬 灵 作为土地面积全国第5、人口总数全国第3、GDP全国第6的产酒、销酒大省&#xff0c;四川酒类消费总额已达800亿元&#xff0c;其中白酒市场规模达到500亿元。 近年来&#xff0c;随着省外名酒提升对四川市场重视&#xff0c;其市场份额也从20年前的3%…