08-看图理解数据结构与算法系列(2-3树)

2-3树

2-3树,是最简单的B-树,其中2、3主要体现在每个非叶子节点都有2个或3个子节点,B-树即是平衡树,平衡树是为了解决不平衡树查询效率问题,常见的二叉平衡书有AVL树,它虽然提高了查询效率,但是插入操作效率不高,因为它需要再每次插入节点后维护树的平衡,而为了解决查询效率同时有兼顾插入效率,于是提出了2-3树。

2-3树特点

  • 2-3树是一棵平衡树,但不是二叉平衡树。
  • 对于高度相同的2-3树和二叉树,2-3树的节点数要大于满二叉树,因为有些节点可能有三个子节点。
  • 2-3树可以是一棵空树。
  • 对于2节点来说,该节点保存了一个key及对应的value,除此之外还保存了指向左右两边的子节点,子节点也是一个2-3节点,左子节点所有值小于key,右子节点所有值大于key。
  • 对于3节点来说,该节点保存了两个key及对应的value,除此之外还保存了指向左中右三个方向的子节点,子节点也是一个2-3节点,左子节点的所有值小于两个key中较小的那个,中节点的所有值在两个key值之间,右子节点大于两个key中较大的那个。
  • 对2-3树进行中序遍历能得到一个排好序的序列。

插入操作

刚开始是空树,插入节点“A”,创建根节点,

插入节点“B”,从根节点开始寻找存放的节点位置,与“A”节点合并后放到同一个叶子上,此时该叶子只包含“AB”两个项目,无需分裂,

继续插入节点“C”,从根节点开始寻找存放的节点位置,找到“AB”叶子节点,将其放进去,

但此时该叶子节点包含了“ABC”三个项目,需要将该节点进行分裂操作,分裂的具体过程如下,找到该节点三个项目中中间大的项,

上移成为最小项和最大项的父节点,而最小项作为中间项的左子节点,最大项作为中间项的右子节点。

继续插入“D”节点,从根节点开始寻找,

大于“B”,所以往右,

找到“C”节点,并合并到该叶子节点,该节点只有两个项目,不必分裂。

继续插入“E”,查找到“CD”叶子节点,放入“E”节点后发现该叶子节点有三个项目,需要分裂,

将中间项提升到父节点,其余两项分裂成两个子节点,“D”上升到父节点后存放在右边,而且父节点只有两个项目,不必再继续分裂。

继续插入“F”节点,

往下看连续分裂两次的情况,继续插入“G”节点,大于“B”,继续比较,

大于“D”,往右子节点,

到右子节点后与“F”比较,发现大于“F”,放到右边,

发现“EFG”叶子节点有三个项目,必须分裂,

将中间项“F”提升到父节点,“E”和“G”左右两项分别称为左右子节点,

提升到父节点后发现父节点包含了“BDF”三项,也需要分裂,于是准备将中间项“F”提升,

发现“BDF”节点本来属于根节点,那么分裂后就没有根节点了,于是需要创建一个新节点作为根节点,即提升的“D”节点作为新的根节点。“B”和“F”左右两项分别作为左右子节点。

总结起来就是:一个节点插入到一棵2-3树中,先寻找该节点应该落到哪个叶子节点上,注意一定是在叶子节点。将新节点作为一个新项加入到叶子节点中,此时如果该节点只有两个项目,则完成插入操作。但如果该节点有三个项目,则需要进行分裂操作,左中右三项按大小排序,将中间项提升到父节点中,而左右两项作为左右子节点,然后可能还没完,因为父节点上可能又包含了三个项目,如果是这样还得做分裂操作,一直递归到父节点只包含一个或两个项目。

查找

2-3树的查找与二叉树的查找类似,从根节点开始比较,如果相等则查找成功,否则往下继续查找,对于只有两个子节点的节点则在其左右子树中递归查找,而对于有三个子节点的节点则需要在左中右子树中递归查找。

如下2-3树,查找“C”节点,

从根节点开始,与“D”比较,“C”小于“D”则往左,

继续与“B”比较,“C”大于“B”则往右,

“C”与“C”相等,找到。

如果要查找“H”节点,从根节点开始,“H”大于“D”则往右,

在“FH”节点中逐个项比较,先跟“F”项比较,“H”大于“F”,继续比较下一项,

“H”等于“H”,找到,在“FH”节点中找到“H”。

如果要查找“G”节点,从根节点开始,“G”大于“D”则往右,

“G”与“FH”节点逐个比较,大于“F”,继续比较下一项,

“G”小于“H”,即“G”间于“F”和“H”之间,于是往中间,

“G”等于“G”,找到。

作者:超人汪小建
链接:https://juejin.im/post/5b7e00456fb9a01a0b3193c7
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/Knight-of-Dulcinea/p/9946062.html

时间: 2024-10-14 11:07:06

08-看图理解数据结构与算法系列(2-3树)的相关文章

09-看图理解数据结构与算法系列(B树)

B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数据库或文件系统. B树特点 B树可以定义一个m值作为预定范围,即m路(阶)B树. 每个节点最多有m个孩子. 每个节点至少有ceil(m/2)个孩子,除了根节点和叶子节点外. 对于根节点,子树个数范围为[2,m],节点内值的个数范围为[1,m-1]. 对于非根节点,节点内的值个数范围为[ceil(m/

12-看图理解数据结构与算法系列(冒泡排序)

冒泡排序 冒泡排序是一种很简单的排序算法,主要思想就是不断走访待排序序列,每次只比较两个相邻元素,如果这俩元素顺序不符合要求则对换它们,不断重复知道没有相邻元素需要对换.在不断走访比较过程中,越大的元素经过交换会慢慢走到数列顶端,所以看起来它就像气泡一样不断往上冒,于是就叫冒泡. 排序要点 比较相邻两个元素,如果前一元素比后一元素大则对换它们的位置. 从头开始对每一对相邻元素都执行1的对比工作,直至结尾最后一对,执行完一轮后,该轮最大的元素被换置到最后. 针对所有元素执行若干轮1和2操作,每次经

14-看图理解数据结构与算法系列(希尔排序)

希尔排序 希尔排序是希尔(Donald Shell)提出的一种排序方法,也属于插入排序,但是简单插入排序的高效版本,也称为缩小增量排序.基本思想是将待排序元素进行增量分组,然后在分组组内进行插入排序,随着增量的减少,每个分组组内的元素越来越多,直至增量减至1时,所有元素都分到同一个组内,执行插入排序后完成整个排序操作. 排序要点 选取一个小于所有待排序元素数量n的整数作为第一个增量,对全部元素进行分组,分组的依据是所有距离为的倍数的记录分到同一组. 对分好的组,在组内进行直接插入排序. 接着取第

13-看图理解数据结构与算法系列(Trie树)

Trie树 Trie树,是一种搜索树,也称字典树或单词查找树,此外也称前缀树,因为某节点的后代存在共同的前缀.它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存.它的核心思想就是减少没必要的字符比较,使查询高效率,即用空间换时间,再利用共同前缀来提高查询效率. Trie树特点 根节点不包含字符,其他节点每个节点只包含一个字符. 从根节点到某一节点经过路径的字符连起来即为该节点对应的字符串. 每个节点的所有子节点字符都不相同

10-看图理解数据结构与算法系列(B+树)

B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存命中率.另外因为叶子节点相连遍历操作很方便,而且数据也具有顺序性,便于区间查找. B+树特点 B+树可以定义一个m值作为预定范围,即m路(阶)B+树. 根节点可能是叶子节点,也可能是包含两个或两个以上子节点的节点. 内部节点如果拥有k个关键字则有k+1个子节点. 非叶子节点不保存数据,只保存

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

一句话+一张图理解——数据结构与算法

https://blog.csdn.net/qq_33414271/article/details/80366014 原文地址:https://www.cnblogs.com/springcloud/p/9065160.html

数据结构与算法系列四(单链表)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

数据结构与算法系列七(队列)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?