数据结构之<树>的介绍

树的基本概念

在数据结构中,树(Tree)是一种层次结构,由节点和边组成。树的基本概念包括根节点、子节点、父节点、兄弟节点等。节点拥有零个或多个子节点,除了根节点外,每个节点有且仅有一个父节点。树的层数称为树的高度。子节点以及它后续节点所形成的数称为子树。

1.二叉树(Binary Tree)

二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树
二叉树的基本概念:

  1. 节点(Node): 二叉树的基本构建单元,包含数据元素以及指向左右子节点的指针。

  2. 根节点(Root): 树的顶端节点,没有父节点。

  3. 叶子节点(Leaf): 没有子节点的节点称为叶子节点。

  4. 父节点、子节点、兄弟节点: 一个节点的直接上级是其父节点,直接下级是其子节点。具有相同父节点的节点互为兄弟节点。

  5. 深度(Depth): 节点的深度是从根节点到该节点的路径长度,根节点的深度为0。

  6. 高度(Height): 节点的高度是从该节点到其最远叶子节点的路径长度,叶子节点的高度为0。

二叉树有以下几种特殊形态:

1.1完全二叉树(Complete Binary Tree)

除了最后一层外,其他层的节点都是满的,且最后一层的节点从左到右连续排列。最后一层空缺的节点必须在右边,左边必须填满。
在这里插入图片描述

1.2满二叉树(Full Binary Tree)

每个节点要么没有子节点,要么有两个子节点。
在这里插入图片描述

1.3完美二叉树(Perfect Binary Tree)

所有叶子节点都在同一层,且每个非叶子节点都有两个子节点。
在这里插入图片描述

2.平衡二叉树(Balanced Binary Tree)

平衡二叉树是一种特殊的二叉树,它的左子树和右子树的高度差不超过1。常见的平衡二叉树有AVL树和红黑树。
在这里插入图片描述

3.二叉搜索树(Binary Search Tree)

二叉搜索树是一种有序的二叉树,对于每个节点,其左子树的值都小于该节点的值,右子树的值都大于该节点的值。这种特性使得在二叉搜索树中进行查找、插入和删除操作非常高效。
在这里插入图片描述

4.自平衡二叉搜索树

自平衡二叉搜索树是一种特殊的二叉搜索树,它在插入或删除节点时会自动调整树的结构,以保持树的平衡性。常见的自平衡二叉搜索树有红黑树和AVL树。

  • AVL树(AVL Tree):
    在这里插入图片描述

AVL树是一种高度平衡的二叉搜索树,它的每个节点都有一个平衡因子(Balance Factor),表示其左子树高度和右子树高度之差。AVL树满足以下性质:

  1. 每个节点的平衡因子只能是-1、0或1。
  2. 对于每个节点,其左子树和右子树的高度差的绝对值不超过1。

AVL树通过对节点进行旋转操作来保持树的平衡性。当插入或删除节点后,如果破坏了平衡性,AVL树会进行旋转操作来调整节点的位置,使得树重新平衡。相比于红黑树,AVL树的平衡性更加严格,因此在某些场景下,AVL树的查询效率可能更高。

  • 红黑树(Red-Black Tree):
    在这里插入图片描述

红黑树是一种具有自平衡性质的二叉搜索树。它的每个节点都有一个颜色属性,可以是红色或黑色。红黑树满足以下几个性质:

  1. 每个节点要么是红色,要么是黑色。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL节点,空节点)是黑色。
  4. 如果一个节点是红色,则它的两个子节点都是黑色。
  5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。

通过这些性质,红黑树可以保持树的平衡,使得树的高度相对较小,从而提高了查找、插入和删除操作的效率。红黑树的插入和删除操作可能需要进行旋转和颜色调整来保持平衡性。

一般来说,红黑树适用于插入和删除操作较多的场景,而AVL树适用于对查询操作有更高要求的场景。

二叉树的应用:

  1. 搜索和排序: 二叉搜索树可以用于快速搜索和排序。

  2. 表达式树: 二叉树可以用于表示数学表达式,便于求值和转换。

  3. 文件系统: 文件系统中的目录结构通常可以用二叉树表示。

  4. 哈夫曼树: 用于数据压缩算法中,构建最优编码树。

  5. 数据库索引: 数据库中的索引通常使用二叉树结构。

5.三叉树(Ternary Tree)

三叉树是一种每个节点最多有三个子节点的树结构。它可以用于表示多叉树的一种特殊情况。
在这里插入图片描述

6.多叉树(Multiway Tree)

多叉树是一种每个节点可以有多个子节点的树结构。每个节点的子节点数量可以是任意的。
在这里插入图片描述


图片来源:峰华前端工程师

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

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

相关文章

基于ssm居家养老系统论文

居家养老系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了居家养老系统的开发全过程。通过分析高校学生综合素质评价管理方面的不足,创建了一个计算机管理居家养老系统的方案。文章介绍了居家…

DOS 系统(命令行)

文章目录 DOS 系统DOS 常用命令DOS 高级命令DOS 批处理命令DOS 应用场景 DOS 系统 操作系统的发展史(DOS/Windows篇) DOS操作系统的历史 DOS(Disk Operating System) 是 磁盘操作系统 的缩写,是一种早期的个人计算机操…

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

FPGA引脚分配的问题

今天在做一个FPGA的实验时,在引脚分配时失败了,出现了如下报错: 我当时分配的引脚是PIN_AE19,然而奇怪的是我之前并未分配这个引脚,我使用的开发工具是Quartus II 9.1 Web Edition,算个老版本了。 有的网站…

云渲染技术下的虚拟现实:技术探索与革新思考

虚拟现实(含增强现实、混合现实)是新一代信息技术的重要前沿方向,是数字经济的重大前瞻领域,将深刻改变人类的生产生活方式,产业发展战略窗口期已然形成。但是虚拟现实想要深入改变影响我们的生活,以下技术…

linux sed批量修改替换文件中的内容/sed特殊字符

sed系列文章 linux常用命令(9):sed命令(编辑/替换/删除文本)linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行linux sed批量修改替换文件中的内容/sed特殊字符 文章目录 sed系列文章一、sed替换文本语法1.1、基础语法1.2、高阶语法 二、实战/实例2.1…

(5)shell命令以及Linux的权限

写在前面 本章我们将重点讲解 Linux 权限,这是 Linux 基础部分中非常重要的一部分。内容比较干,我会稍稍正经些去讲解。话不多说,我们直接切入正题。 shell 命令及运行原理 严格意义上说的是一个操作系统,我们称之为 —— &…

【案例】--“特别抢购”案例

目录 一、案例背景二、技术方案思路三、技术方案具体设计3.1、表设计3.2、Java代码实现一、案例背景 A公司向供应商B公司买了一套软件产品。B公司的这套产品有多个应用系统服务【如appId1、appId2、appId3】,每个应用都有各自的业务应用场景,但都需要管理文档,那么就需要磁…

PMP项目管理 - 资源管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

高质量C/C++代码心得

写出高质量的C/C代码是一个涉及多方面的任务,它要求程序员不仅具备扎实的语言基础,还需要掌握一系列的软件设计和开发原则。下面将详细介绍如何写出高质量的C/C代码,并通过10个例子进行具体阐述。 一、编码规范 编写高质量的代码&#xff…

波奇学Linux:进程终止

写时拷贝底层原理图 子进程谁先运行,由调度器决定 进程退出场景 代码运行完毕,结果正确:有返回值,返回0 代码运行完毕,结果不正确:有返回值,返回非0 代码异常终止。没有返回值 return 0的…

【Qt】使用QDataStream向QByteArray内读写数据时,输出QByteArray数据为空解决方案

原因 今天写示例时&#xff0c;用到使用QDataStream类向QByteArray读写数据&#xff0c;但打印出来为空。 下面是简化代码&#xff1a; QByteArray ba;QDataStream out(&ba, QIODevice::WriteOnly);out << "helloworld";qDebug().noquote() << &quo…