【数据结构基础】树 - 基础和Overview

news2024/9/23 5:19:41

知识体系结构

树是一种数据结构,它是n(n>=0)个节点的有限集。n=0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。

区别于线性表一对一的元素关系,树中的节点是一对多的关系。树具有以下特点:

  • n>0时,根节点是唯一的,不可能存在多个根节点。

  • 每个节点有零个至多个子节点;除了根节点外,每个节点有且仅有一个父节点。根节点没有父节点。

树的相关概念

树有许多相关的术语与概念,在学习树的结构之前,我们要熟悉这些概念。

  • 子树: 除了根节点外,每个子节点都可以分为多个不相交的子树。(图二)

  • 孩子与双亲: 若一个结点有子树,那么该结点称为子树根的"双亲",子树的根是该结点的"孩子"。在图一中,B、H是A的孩子,A是B、H的双亲。

  • 兄弟: 具有相同双亲的节点互为兄弟,例如B与H互为兄弟。

  • 节点的度: 一个节点拥有子树的数目。例如A的度为2,B的度为1,C的度为3.

  • 叶子: 没有子树,也即是度为0的节点。

  • 分支节点: 除了叶子节点之外的节点,也即是度不为0的节点。

  • 内部节点: 除了根节点之外的分支节点。

  • 层次: 根节点为第一层,其余节点的层次等于其双亲节点的层次加1.

  • 树的高度: 也称为树的深度,树中节点的最大层次。

  • 有序树: 树中节点各子树之间的次序是重要的,不可以随意交换位置。

  • 无序树: 树种节点各子树之间的次序是不重要的。可以随意交换位置。

  • 森林: 0或多棵互不相交的树的集合。例如图二中的两棵树为森林。

二叉树、完全二叉树、满二叉树

  • 二叉树: 最多有两棵子树的树被称为二叉树

  • 斜树: 所有节点都只有左子树的二叉树叫做左斜树,所有节点都只有右子树的二叉树叫做右斜树。(本质就是链表)

  • 满二叉树: 二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上

  • 完全二叉树: 如果一个二叉树与满二叉树前m个节点的结构相同,这样的二叉树被称为完全二叉树

二叉查找树 - BST

二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;

  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;

  • 任意节点的左、右子树也分别为二叉查找树;

  • 没有键值相等的节点。

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低为 O ( log ⁡ n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

平衡二叉树 - AVL

含有相同节点的二叉查找树可以有不同的形态,而二叉查找树的平均查找长度与树的深度有关,所以需要找出一个查找平均长度最小的一棵,那就是平衡二叉树,具有以下性质:

  • 要么是棵空树,要么其根节点左右子树的深度之差的绝对值不超过1;

  • 其左右子树也都是平衡二叉树;

  • 二叉树节点的平衡因子定义为该节点的左子树的深度减去右子树的深度。则平衡二叉树的所有节点的平衡因子只可能是-1,0,1。

红黑树

红黑树也是一种自平衡的二叉查找树。

  • 每个结点要么是红的要么是黑的。(红或黑)

  • 根结点是黑的。 (根黑)

  • 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 (叶黑)

  • 如果一个结点是红的,那么它的两个儿子都是黑的。 (红子黑)

  • 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

用法最广:

  • Java ConcurrentHashMap & TreeMap

  • C++ STL: map & set

  • linux进程调度Completely Fair Scheduler,用红黑树管理进程控制块

  • epoll在内核中的实现,用红黑树管理事件块

  • nginx中,用红黑树管理timer等

哈弗曼树

哈夫曼又称最优二叉树。是一种带权路径长度最短的二叉树,一般可以按下面步骤构建:

  • 将所有左,右子树都为空的作为根节点。

  • 在森林中选出两棵根节点的权值最小的树作为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。

  • 从森林中删除这两棵树,同时把新树加入到森林中。

  • 重复2,3步骤,直到森林中只有一棵树为止,此树便是哈夫曼树。

B树

B树(英语: B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一种自平衡的m阶树,与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。

  • 根结点至少有两个子女。

  • 每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

  • 每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

  • 所有的叶子结点都位于同一层。

  • 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

B-Tree中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个3阶的B-Tree:

B+树

B+ 树是一种树数据结构,通常用于关系型数据库(如Mysql)和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树恰好相反。

在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点 中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。

b+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),所以同样大小的节点,b+树相对于b树能够有更多的分支,使得这棵树更加矮胖,查询时做的IO操作次数也更少。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

R树

R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形(MBR),这个最小外接矩形就成为上一层的一个节点。因为所有节点都在它们的最小外接矩形中,所以跟某个矩形不相交的查询就一定跟这个矩形中的所有节点都不相交。叶子节点上的每个矩形都代表一个对象,节点都是对象的聚合,并且越往上层聚合的对象就越多。也可以把每一层看做是对数据集的近似,叶子节点层是最细粒度的近似,与数据集相似度100%,越往上层越粗糙。

总结

我们知道,实际应用当中,我们经常使用的是查找和排序操作,这在我们的各种管理系统、数据库系统、操作系统等当中,十分常用。

数组的下标寻址十分迅速,但计算机的内存是有限的,故数组的长度也是有限的,实际应用当中的数据往往十分庞大;而且无序数组的查找最坏情况需要遍历整个数组;后来人们提出了二分查找,二分查找要求数组的构造一定有序,二分法查找解决了普通数组查找复杂度过高的问题。任何一种数组无法解决的问题就是插入、删除操作比较复杂,因此,在一个增删查改比较频繁的数据结构中,数组不会被优先考虑

普通链表由于它的结构特点被证明根本不适合进行查找

哈希表是数组和链表的折中,同时它的设计依赖散列函数的设计,数组不能无限长、链表也不适合查找,所以也不适合大规模的查找

二叉查找树因为可能退化成链表,同样不适合进行查找

AVL树是为了解决可能退化成链表问题,但是AVL树的旋转过程非常麻烦,因此插入和删除很慢,也就是构建AVL树比较麻烦

红黑树是平衡二叉树和AVL树的折中,因此是比较合适的。集合类中的Map、关联数组具有较高的查询效率,它们的底层实现就是红黑树。

多路查找树 是大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下。

B树与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。它的应用是文件系统及部分非关系型数据库索引。

B+树在B树基础上,为叶子结点增加链表指针(B树+叶子有序链表),所有关键字都在叶子结点 中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中。通常用于关系型数据库(如Mysql)和操作系统的文件系统中。

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针, 在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3。

R树是用来做空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据建立索引。

Trie树是自然语言处理中最常用的数据结构,很多字符串处理任务都会用到。Trie树本身是一种有限状态自动机,还有很多变体。什么模式匹配、正则表达式,都与这有关。

针对大量数据,如果在内存中作业优先考虑红黑树(map,set之类多为RB-tree实现),如果在硬盘中作业优先考虑B系列树(B+, B, B*)

参考文章

文章中一些图片和内容来源:
  • 数据结构图文解析之: 树的简介及二叉排序树C++模板实现. https://www.it610.com/article/3607922.htm

  • 各种二叉树的介绍 https://www.cnblogs.com/aspirant/p/9019396.html

  • 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究 https://www.cnblogs.com/williamjie/p/11081096.html

  • 数据结构之树 https://blog.csdn.net/wannuoge4766/article/details/83998377

  • B+Tree原理及mysql的索引分析 https://www.cnblogs.com/xiaoxi/p/6894610.html

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

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

相关文章

Linux嵌入式开发——文件权限

文章目录Linux嵌入式开发——文件权限文件权限文件权限管理修改文件权限修改文件所属用户拥有者拥有者组Linux嵌入式开发——文件权限 文件权限 文件权限是指不同的用户或用户组对某个文件拥有的权限&#xff0c;文件的权限分为三种&#xff0c;并且可以使用二进制表示文件权…

kerberos环境下parcel方式部署flink1.15.3 基于CDH6.3.2 Flink on Yarn

1.1 Flink on Yarn的优势相对于 Standalone 模式&#xff0c;在Yarn 模式下有以下几点好处&#xff1a;1.资源按需使用&#xff0c;提高集群的资源利用率&#xff1b;2.任务有优先级&#xff0c;根据优先级运行作业&#xff1b;3.基于 Yarn 调度系统&#xff0c;能够自动化地处…

通信原理笔记—模拟信号的数字编码

目录 低通与带通信号的抽样定理&#xff1a; 模拟信号数字编码的基本概念&#xff1a; 模拟信号的抽样&#xff1a; 低通信号的理想抽样&#xff1a; 低通采样定理&#xff1a; 采样方式&#xff1a; 冲激采样示例&#xff1a; 低通信号的自然抽样&#xff1a; 带通抽样…

正版授权|Charles 4 网络封包分析调试工具软件

Charles 4 是一款 HTTP 代理 /HTTP 监视器/反向代理&#xff0c;使开发人员能够查看其机器和 Internet 之间的所有 HTTP 和 SSL / HTTPS流量。这包括请求、响应和 HTTP 标头&#xff08;包含 Cookie 和缓存信息&#xff09;。 授权分类&#xff1a;单许可证 站点许…

Python程序设计-第2章Python程序语句

第2章Python程序语句一.预习笔记 1.1 if语句 if 条件 : 执行语句 注意&#xff1a;条件后面要有 : 号&#xff0c;其次条件不需要括号包裹&#xff0c;然后执行语句需要有缩进 1.2 if else语句 if 条件 : 执行语句1 else : 执行语句2 注意&#xff1a;条件成立执行语…

Vue3中使用Tinymce富文本编辑器(版本最新)

使用目录前言一、安装方法一&#xff08;npm、yarn下载&#xff09;二、安装方法二&#xff08;下载官网压缩包方法&#xff09;——推荐总结前言 最近使用了WangEditor编辑器和Tinymce编辑器&#xff0c;使用方法如下&#xff08;采用的编辑器版本是官网最新的&#xff09; 汉…

@Configuration 和 @Component 区别

本文参考1&#xff1a;https://blog.csdn.net/isea533/article/details/78072133 本文参考2&#xff1a;https://blog.csdn.net/weixin_52850476/article/details/124410800 一句话概括就是 Configuration 中所有带 Bean 注解的方法都会被动态代理&#xff0c;因此调用该方法…

数据库密码定期轮换(AWS版)

问题 需要定期轮换AWS上面的RDS数据库的密码&#xff0c;而且&#xff0c;需要让业务程序无感知。 思路 AWS有个一个aws-secretsmanager-jdbc库&#xff0c;只要在SpringBoot的基础上面集成即可&#xff0c;就可以使用secrets manager来定期轮换数据库的密码了。 解决步骤 …

Excel VBA 讲座05 - InputBox和MsgBox使用

本篇介绍的内容&#xff1a; 1&#xff0c;当用户使用宏或procedure时&#xff0c;使用InputBox来接收或收集用户输入的信息。 2&#xff0c;根据需求使用IF语句构建逻辑。 3&#xff0c;使用Message Box将信息展示给用户&#xff0c;比如用户输出错误&#xff0c;就提示用户…

np.loadtxt()读取数据

前言 机器学习中使用np.loadtxt()可以高效的导入数据&#xff0c;np.loadtxt()适合.txt文件和.csv文件。但是它默认读取float类型的值。 1.np.loadtxt()读取txt文件 1-1 基础参数 numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, skiprows0, usecol…

uniapp获取支付宝user_id - 支付宝提现 - 登录授权 - APP支付宝登陆 - H5支付宝授权

效果图 uniapp须知(无奈之处) uniapp绑定支付宝user_id提现 - 方法对比: ==== 不同接口 ==== 【APP支付宝登录】 https://opendocs.alipay.com/open/218/105325 【网站支付宝登录】

PMP证书有什么用?

有没有用看你的考证目的&#xff0c;总的来说就是敲门砖的作用&#xff0c;项目招聘、应聘项目经理都需要pmp 证书。⭕但是事在人为&#xff0c;祈祷考完 PMP 就能升职加薪走上人生巅峰的想法&#xff0c;一纸证书是做不到的。PS&#xff1a;身边有考了 PMP 之后跳槽薪资涨幅 3…

阳康后身体还是不舒服怎么办?

很多年轻朋友阳康后恢复的还可以&#xff0c;逐渐回到以前的身体状态&#xff0c;但是家里老人体质偏弱&#xff0c;恢复情况就没那么乐观了。有些还一直伴随着没有嗅觉、疲惫、咳嗽等后遗症。要让老人快速恢复健康&#xff0c;生病后一定要注意这几点&#xff1a;每天保证7-8小…

测试开发中的虫剂悖论

测试开发中的虫剂悖论 1 初识虫剂悖论 提到 虫剂悖论(pesticide paradox)&#xff0c;我相信很多人都没听说的&#xff0c;除非是生物学专业的同学或者老师。 虫剂悖论描述的是重复使用某种农药杀灭害虫&#xff0c;时间越久&#xff0c;杀虫的效果就越差。 之所以这样&#xf…

压阻式(压)力传感器-个人笔记

这是个人笔记 最终要求&#xff0c;单个的压阻式压力传感器、阵列之后的压力传感器、三维力传感器 关键词&#xff1a;力传感器&#xff0c;压力传感器&#xff0c;多轴力传感器&#xff0c;应变式传感器&#xff0c;应变式力传感器&#xff0c;电阻应变式传感器&#xff0c;f…

除 svn、Testlink 外,还有哪些不错的测试用例管理工具?

类似TestLink的 9 大测试用例管理平台&#xff1a;1、PingCode&#xff1b;2、TestRail&#xff1b;3、Xray&#xff1b;4、Jira&#xff1b;5、PractiTest&#xff1b;6、PractiTest&#xff1b;7. Zephyr Enterprise&#xff1b;8、MeterSphere&#xff1b;9、Bugzilla。一、…

【Flink】浅谈Flink架构和调度

【Flink】浅谈Flink架构和调度 Flink架构 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器&#xff0c;例如【Hadoop YARN】、【Apache Mesos】和【Kubernetes】&#xff0c;但也可以设置作为独立集群甚…

Ethercat系列(2)PDO动态映射设置过程

过程数据对象PDOPDO一般用于实时数据更新&#xff1b;其分为接收PDO&#xff08;RxPDO&#xff09;和发送PDO&#xff08;TxPDO&#xff09;&#xff0c;前者的数据流方向是主站到从站&#xff0c;TxPDO是从站到主站。PDO功能支持同步周期的刷新方式&#xff0c;也支持非周期性…

解决nacos2.1版本连接mysql8.x版本异常的问题

在测试环境部署nacos集群的时候使用的是mysql5.7版本&#xff0c;部署没有什么异常。但是在生产环境中我们使用的是mysql8.x版本&#xff0c;在启动nacos的时候各种报错。在网上看了很多解决办法花了挺长时间去排错也没有处理好问题网上最常见的两种方式修改pom文件&#xff1a…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

动态规划 一、309.最佳买卖股票时机含冷冻期 题目&#xff1a; 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#x…