【数据结构】树家族

news2024/11/26 20:39:01

目录

  • 树的相关术语
  • 树家族
    • 二叉树
      • 霍夫曼树
      • 二叉查找树 BST
      • 平衡二叉树 AVL
      • 红黑树
      • 伸展树
      • 替罪羊树
    • B树
      • B+树
      • B* 树

在这里插入图片描述

当谈到数据结构中的树时,我们通常指的是一种分层的数据结构,它由节点(nodes)组成,这些节点之间以边(edges)相连。树的一个重要特性是它们具有一个根节点(root),它位于树的顶部,并且每个节点都有一个父节点(parent)以及零个或多个子节点(children)。树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。

树的相关术语

根节点(Root):树的顶层节点,它没有父节点,是树的起点。

父节点(Parent):一个节点的直接上级节点。

子节点(Children):一个节点的直接下级节点。

叶子节点(Leaf):没有子节点的节点称为叶子节点,它们位于树的末端。

深度(Depth):一个节点的深度指的是从根节点到该节点的唯一路径的边数。

高度(Height):树的高度是指树中任意节点的最大深度。

子树(Subtree):一个节点及其所有子孙节点构成的集合,也是一个树。

节点的度(Degree):一个节点拥有的子节点数目。

树的度(Degree of Tree):树中节点的最大度数。

层级(Level):根节点在第一层,其子节点在第二层,以此类推。

兄弟节点(Siblings):具有相同父节点的节点称为兄弟节点。

有序树与无序树:如果树中的节点是按照一定的顺序排列的,那么称它为有序树,否则称为无序树。

树家族

在这里插入图片描述

二叉树

在这里插入图片描述二叉树的任意节点至多包含两棵子树

二叉树遍历:
二叉树的遍历是指从二叉树的根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次。二叉树的访问次序可以分为四种:
前序遍历 中序遍历 后序遍历 层次遍历

在这里插入图片描述

满二叉树除了子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充。
完全二叉树除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。
严格二叉树除了叶子结点之外的每一个结点都有两个孩了结点。

霍夫曼树

在这里插入图片描述
霍夫曼树的构建过程是基于一个给定的字符集合,每个字符都有一个权值(通常是它在文本中出现的频率)。构建霍夫曼树的目标是使得权值较大的字符在树中的深度相对较小,从而实现了最优前缀编码。霍夫曼编码可以借助霍夫曼树实现。

二叉查找树 BST

在这里插入图片描述

  • 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  • 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  • 任意节点的左、右子树也分别为二叉查找树;
  • 没有键值相等的节点。

平衡二叉树 AVL

在这里插入图片描述
平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树
平衡二叉树是一棵相对平衡的树,它的高度近似于 l o g 2 ( n ) log₂(n) log2(n),其中 n 是节点的数量。
平衡二叉树又称为AVL树,得名于其发明者 Adelson-Velsky 和 Landis。

在这里插入图片描述
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
AVL树是一种特殊的BST树,它满足以下额外的条件:

  • 每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1,平衡因子 = | 左子树高度 - 右子树高度 |

在一些情况下,添加删除会打破AVL树的自平衡性。所以 AVL树定义了旋转操作, 在平衡因子大于等于2时, AVL树会旋转来调整树的结构, 来重新满足平衡因子小于2。

AVL树适合用于插入删除次数比较少,但查找多的情况。

红黑树

在这里插入图片描述
红黑树和AVL树一样,也是自平衡二叉查找树
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

  • 节点是红色或黑色。
  • 根节点是黑色。
  • 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点

我们构建红黑树的过程是通过逐个插入新节点来完成的,在插入节点时,初始化根节点为黑节点,随后插入子节点时,初始为红色,然后通过修改颜色和旋转节点来完成平衡,最终使一棵子树完成平衡操作。

伸展树

伸展树是二叉查找树,满足左子树的key<=根节点的<=右子树的key的特点。不保证树是平衡的,但各种操作的平摊的复杂度是logn。从效率上上和平衡树的效率差不多。从编码复杂度上伸展树比红黑树和AVL简单了很多。
伸展树的思想:二八原则 ,也就是把那些访问频率高的的字段尽可能移到离根节点近的位置,所以每次访问节点都会通过各种旋转的方法将访问节点旋转到根节点。

在这里插入图片描述

替罪羊树

替罪羊树是计算机科学中,一种基于部分重建的自平衡二叉搜索树。在替罪羊树上,插入或删除节点的平摊最坏时间复杂度是O(log n),搜索节点的最坏时间复杂度是O(log n)。
在非平衡的二叉搜索树中,每次操作以后检查操作路径,找到最高的满足max(size(son_L),size(son_R))>alpha*size(this)的结点,重建整个子树。这样就得到了替罪羊树,而被重建的子树的原来的根就被称为替罪羊节点。

替罪羊树替罪羊树是一棵自平衡二叉搜索树,由ArneAndersson提出。替罪羊树的主要思想就是将不平衡的树压成一个序列,然后暴力重构成一颗平衡的树。


B树

一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:

  • 根结点至少有两个子女;
  • 每个非根节点所包含的关键字个数 j 满足: ⌈ m 2 ⌉ − 1 < = j < = m − 1 \left \lceil \frac{m}{2} \right \rceil - 1 <= j <= m - 1 2m1<=j<=m1
  • 除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足: ⌈ m 2 ⌉ < = k < = m \left \lceil \frac{m}{2} \right \rceil <= k <= m 2m<=k<=m
  • 所有的叶子结点都位于同一层。
    在这里插入图片描述

B树(B-Tree)是一种自平衡的树,它是一种多路搜索树(并不是二叉的),能够保证数据有序。同时它还保证了在查找、插入、删除等操作时性能都能保持在O(logn),为大块数据的读写操作做了优化,同时它也可以用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)

B+树

在这里插入图片描述
B+树是在B树的基础上又一次的改进,其主要对两个方面进行了提升,一方面是查询的稳定性,另外一方面是在数据排序方面更友好。

B+树构建规则:

  • B+树的非叶子节点不保存具体的数据,而只保存关键字的索引,而所有的数据最终都会保存到叶子节点。因为所有数据必须要到叶子节点才能获取到,所以每次数据查询的次数都一样,这样一来B+树的查询速度也就会比较稳定,而B树的查找过程中,不同的关键字查找的次数很有可能都是不同的(有的数据可能在根节点,有的数据可能在最下层的叶节点)。
  • B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。因为叶子节点都是有序排列的。
  • 非叶子节点的子节点数=关键字数;另一种为非叶节点的关键字数=子节点数-1。这里有两种算法的实现方式,虽然他们数据排列结构不一样,但其原理还是一样的Mysql 的B+树是用第一种方式实现。

B树与B+树的比较:

  1. B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定。

  2. B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。

  3. B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

B树相对于B+树的优点是,如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字和数据,所以在查询这种数据检索的时候会要比B+树快。

B* 树

B*树又是对B+数的再一次改进。

两者有以下两方面的不同:

  • 首先是关键字个数限制问题,B+树初始化的关键字初始化个数是 ⌈ m 2 ⌉ \left \lceil \frac{m}{2} \right \rceil 2m,b*树的初始化个数为 ⌈ 2 m 3 ⌉ \left \lceil \frac{2m}{3} \right \rceil 32m
  • B+树节点满时就会分裂,而B*树节点满时会检查兄弟节点是否满(因为每个节点都有指向兄弟的指针),如果兄弟节点未满则向兄弟节点转移关键字,如果兄弟节点已满,则从当前节点和兄弟节点各拿出1/3的数据创建一个新的节点出来。

在这里插入图片描述


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

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

相关文章

Web自动化测试 —— cookie复用

一、cookie简介 cookie是一些数据&#xff0c;存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时&#xff0c;在链接关闭后&#xff0c;服务端不会记录用户信息 二、为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入若用例需要经常执行&…

nodejs+vue+python+php在线购票系统的设计与实现-毕业设计

伴随着信息时代的到来&#xff0c;以及不断发展起来的微电子技术&#xff0c;这些都为在线购票带来了很好的发展条件。同时&#xff0c;在线购票的范围不断增大&#xff0c;这就需要有一种既能使用又能使用的、便于使用的、便于使用的系统来对其进行管理。在目前这种大环境下&a…

你渲染的3ds Max效果图为什么这么假?原来问题出在这!

有许多设计新手刚开始做效果图时&#xff0c;常常抱怨自己的作品看起来太假了&#xff0c;但又不知道怎么改。根据我的经验总结&#xff0c;我整理了以下几点可能导致你的3ds Max渲染效果图显得不够真实的原因。 1.三维模型不精致 如果模型细节不够精细&#xff0c;渲染出来的…

QT学习之QT概述

1.1 什么是QT&#xff1f; Qt是一个跨平台的C图形用户界面应用程序框架。 QT特点&#xff1a; 跨平台&#xff0c;几乎支持所有的平台接口简单&#xff0c;容易上手&#xff0c;学习QT框架对学习其他框架有参考意义。一定程度上简化了内存回收机制开发效率高&#xff0c;能够…

【Linux】 ps 命令使用

ps &#xff08;英文全拼&#xff1a;process status&#xff09;命令用于显示当前进程的状态&#xff0c;类似于 windows 的任务管理器。 语法 ps [选项] ps命令 -Linux手册页 著者 ps最初由布兰科兰克斯特撰写<lankestefwi.uva.nl>。迈克尔K约翰逊<johnsonmred…

Proteus仿真--12864LCD显示计算器键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的12864LCD液晶显示电话拨号键盘按键实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计主要介绍计算器键盘仿真&#xff0c;按键按下后在12864液晶上显示对应按键键值 仿真运行视频 Proteus仿真--12864LCD显示计算器…

3.20每日一题(分部积分、换元求定积分)

类型多项式的n次幂&#xff1a; 方法一&#xff1a; 展开然后求积分 方法二&#xff1a; 换元&#xff0c;令x-1t&#xff0c;再展开 方法三&#xff1a; 把一个整体凑到dx&#xff0c;再分部积分&#xff1b;如把&#xff08;x-1&#xff09;的n次幂凑到dx&#xff0c;分部…

Docker学习——②

文章目录 1、Docker是什么1.1 Docker本质1.2 Docker的引擎迭代1.3 Docker和虚拟机的区别1.4 Docker 为什么比虚拟机资源利用率高&#xff0c;启动快&#xff1f;1.5 Docker 和 JVM 虚拟化的区别&#xff1f; 2、Docker架构3、Docker生态3.1 新时代软件诉求3.2 Docker 解决方案 …

第二章 01Java基础-注释、关键字、字面量、变量以及计算机的存储数据

文章目录 前言一、注释二、关键字三、字面量四、变量五、计算机中的存储数据总结前言 今天我们学习Java基础,注释、关键字、字面量、变量以及计算机的存储数据 一、注释 1.注释是在程序指定位置添加说明性信息,简单理解为就是对代码的一种解释 2.注释分为单行注释、多行注…

Java编程--多线程/多线程的构造/多线程的属性/线程中断/线程的状态/线程等待

前言 逆水行舟&#xff0c;不进则退&#xff01;&#xff01;&#xff01; 进程与线程 什么是进程&#xff1f; 答&#xff1a;进程是操作系统分配资源的最小单元&#xff0c;它是运行中的程序的实例&#xff0c;或者说&#xff0c;是应用程序的一次动态执行。…

阿里云双11活动时间、活动入口、优惠政策详细解读

阿里云2023年双11推出了金秋云创季活动&#xff0c;作为年终最大的一次优惠促销活动&#xff0c;活动力度还是很不错的&#xff0c;可以领取上云满减券礼包&#xff0c;百科产品满减折上折&#xff0c;2核2G3M云服务器1年99元&#xff0c;新老同享&#xff0c;续费同价&#xf…

【实战Flask API项目指南】之三 路由和视图函数

实战Flask API项目指南之 路由和视图函数 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时&…

3.Docker的客户端指令学习与实战

1.Docker的命令 1.1 启动Docker&#xff08;systemctl start docker&#xff09; systemctl start docker1.2 查看docker的版本信息&#xff08;docker version&#xff09; docker version1.3 显示docker系统范围的信息&#xff08;docker info&#xff09; docker info1.4…

Qt QtCreator添加自定义注释

在写代码的时候我们为了规范化&#xff0c;一般会加文件注释、类注释和函数注释&#xff1b;用注释来说明我们的代码&#xff0c;也方便模块化开发&#xff0c;那么我们在写注释的时候经常会写一些重复的内容&#xff0c;我们会复制粘贴。这样一来二去&#xff0c;就显得很繁琐…

持续进化,快速转录,Faster-Whisper对视频进行双语字幕转录实践(Python3.10)

Faster-Whisper是Whisper开源后的第三方进化版本&#xff0c;它对原始的 Whisper 模型结构进行了改进和优化。这包括减少模型的层数、减少参数量、简化模型结构等&#xff0c;从而减少了计算量和内存消耗&#xff0c;提高了推理速度&#xff0c;与此同时&#xff0c;Faster-Whi…

如何查看WiFi密码

本文分享一下手机和电脑上如何查看已经连接过的WiFi的密码&#xff0c;然后好分享给他人。 手机上分享wifi密码很简单&#xff0c;步骤如下&#xff1a; 生成二维码&#xff0c;读取WiFi密码 1、首先&#xff0c;在“设置”中找到“无线网络”&#xff0c;点击需要查找密码的Wi…

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言&#xff1a; VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验&#xff0c;还为景区旅游文化注入了新的生机。 一&#xff0e;VR全景技术&#xff1a;革新旅游体验 1.什么是VR全景技术&#xff1f; VR全景技术是一种虚拟现实技术&am…

VB.NET—窗体引起的乌龙事件

目录 前言: 过程: 总结: 升华: 前言: 分享一个VB.NET遇到的一个问题&#xff0c;开始一直没有解决&#xff0c;这个问题阻碍了很长时间&#xff0c;成功的变成我路上的绊脚石&#xff0c;千方百计的想要绕过去&#xff0c;但事与愿违怎么也绕不过去&#xff0c;因为运行不了…

HiveSQL中last_value函数的应用

一、背景 在以下数据中如何实现对每一个列按照更新时间取最新的非null值&#xff1f; 1 a a null 202301 202301 1 b b null null 202302 1 null c null null 202303 1 d null null null 202304如何实现…

速学数据结构 | (超级干货)业界程序员公认的实现栈最简单的方法!太简单了

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525;个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位铁铁们大家好啊&#xff0c;今天来给大家更新一下栈这个数据结构,…