【概述】

2-3 树是一种多路查找树,其满足于以下性质:

  • 每个结点都具有两个孩子或三个孩子,具有两个孩子的结点称为 2 结点,具有三个孩子的结点称为 3 结点
  • 2 结点包含一个元素和两个孩子,左子树包含元素小于根结点元素,右子树包含元素大于根结点元素
  • 3 结点包含一大一小两个元素和三个孩子,左子树包含较小元素,右子树包含较大元素,中间子树包含介于两者之间的元素
  • 所有的叶结点都在同一层

如上图,12、48、10、15、24、31 都是 2 结点,{18,33}、{23,30}、{20,21}、{45,47}、{50,52} 都是 3 结点。

当所有的叶结点都处于同一层时,那么这棵树就是树高平衡的,可见 2-3 树是树高平衡的,其能够以相对较低的代价保持树高平衡。

此外,容易从 2-3 树的定义推出树的叶结点个数与树的深度间的关系:

  • 一个高度为 k 的 2-3 树至少有 2^(k-1) 个叶结点,此时每个分支结点都有 2 个孩子,形成一棵满二叉树的形状
  • 一个高度为 k 的 2-3 树最多有 3^(k-1) 个叶结点,此时每个分支结点都有 3 个孩子,形成一棵满三叉树的形状

【查找】

在 2-3 树中,查找一个关键码的过程类似于在二叉排序树中的查找。

在 2-3 树中查找给定值 k 的过程是:

  1. 若 root 是空树,查找失败
  2. 若 k=root->data,查找成功
  3. 对于 2 结点,若 k<root->data,在 root 的左子树进行查找;若 k>root->data,在 root 的右子树进行查找
  4. 对于 3 结点,若 k<root->smallData,在 root 的左子树进行查找;若 k>root->bigData,在 root 的右子树进行查找;否则,在 root 的中间子树进行查找

上述过程一直持续到 k 被找到或者待查找的子树为空,若待查找的子树为空,则查找失败。值得注意的是,当查找失败时,恰好找到了以 k 为键值的新结点在二叉排序树中的插入位置。

以下图为例,要如果查找 24,首先查找根结点,由于 24 大于 smallData=18,小于 bigData 33,那么进入中间子树,在下一层中,同样进入中间分支,到达包含 24 的叶结点。

【插入】

在 2-3 树中,插入一个关键码的过程类似于在二叉排序树中的插入,新纪录同样是插入到叶结点中。

插入过程如下:

1.对于空树,直接插入一个 2 节点

2.找到被插入记录应该插入的叶结点

3.如果应插入位置的叶结点是 2 结点,直接将新纪录插入,将 2 结点升级为 3 结点

4.如果应插入位置的叶结点是 3 结点,则需将其分裂,拆分为两个 2 结点

1)设要插入的叶结点为 L,创建一个新结点 L'

2)L 得到三个关键码中最小的一个,L' 得到三个关键码中最小的一个

3)进行一次提升:将中间的关键码与一个指向 L' 的指针传回父结点,并将被提升的关键码插入父结点

4)如果父结点为 2 结点,那么重复步骤 3

5)如果父结点为 3 结点,那么重复步骤 4 的分裂-提升过程

例如:在下图中插入 14、55

1)插入 14 时:从根结点开始查找,到达存储 15 的叶结点,其是一个 2 结点,直接将 14 插入即可

2)插入 55 时:从根结点开始查找,到达存储 {50,52} 的结点,其是一个 3 结点,需要进行分裂,加入 55 后,三个关键码的值为 50、52、55,其中,令中值 52 提升,小值 50 与大值 55 作为父结点的叶结点

【删除】

在 2-3 树中,删除一个结点与插入一个结点相反。

其过程为:

1.所删除的元素位于非叶子的分支结点时,将树按中序遍历后得到的前驱或后继元素,用其补位即可。

2.所删除的元素位于 3 结点时,在该结点删除该元素即可,不会影响整棵树的结构。

3.所删除的元素位于 2 结点时,此时分为四种情况:

1)2 结点的父结点是 3 结点:此时将 3 结点进行拆分,根据删除要删除的元素的大小,将被拆分的点与 3 结点的子树进行合并

2)2 结点的父结点是 2 结点,且拥有一个 3 结点的右孩子:将父结点与右孩子一起进行左旋,令父结点的右孩子的较小值成为新的父结点,原先的父结点成为新的左孩子,原先的右孩子的较大值不做改变

3)2 结点的父结点是 2 结点,且拥有一个 2 结点的右孩子:先在不破坏 2-3 树的性质的前提下,将 2 结点的右孩子变为 3 结点的右孩子,然后删除要删除的元素,并将剩下的三个点进行左旋调整。

4)当前树是一个满二叉树:此时删除任意一个结点都会破坏 2-3 树的性质,需要考虑在不改变 2-3 树的顺序的情况下,将 2-3 树的层次减少一层。

理论基础 —— 索引 —— 2-3 树相关推荐

  1. mysql 联合索 B 树_MySQL 索引与 B+ 树

    MySQL 索引与 B+ 树 B+ 树 MySQL Innodb 存储引擎是使用 B+ 树来组织索引的.在介绍 B+ 树以前,先认识一下什么是 B 树,B 树是平衡二叉树,与一般的二叉查找树不同,平衡 ...

  2. 一文介绍 Mysql 索引模型 B+ 树

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:后端程序员必备:书写高质量SQL的30条建议个人原创+1博客:点击前往,查看更多 来源:https://segm ...

  3. MySQL 索引 :哈希索引、B+树索引、最左前缀匹配规则、全文索引

    文章目录 索引 什么是索引 索引优缺点与适用场景 常见的索引 哈希索引 自适应哈希索引 B+树索引 聚集索引 非聚集索引 使用方法 联合索引 最左前缀匹配规则 覆盖索引 全文索引 使用方法 索引 什么 ...

  4. MySQL 索引 :哈希索引、B+树索引、全文索引

    文章目录 索引 引言 常见的索引 哈希索引 自适应哈希索引 B+树索引 聚集索引 非聚集索引 使用方法 联合索引 最左前缀匹配规则 覆盖索引 全文索引 使用方法 索引 引言 为什么需要索引? 倘若不使 ...

  5. mysql索引 红黑树_为什么MySql索引使用B+树?

    前言 面试中我们经常碰到面试官问到数据库索引,问到索引就会问你索引的数据结构.类似这种数据结构对于普通程序员来说记住概念几天就忘了,而且概念不是每个人都能很好都理解,所以针对这一原因,我简单通俗都像大 ...

  6. Mysql 索引模型 B+ 树详解

    一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...

  7. MySQL之InnoDB主键索引的B+树的高度计算

    文章目录 MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键bigint类型.一行记录数据大小1k MySQL之InnoDB主键索引的B+树的高度计算 1.高度为2和3.主键b ...

  8. mysql 二叉树表设计_Mysql 索引模型 B+ 树详解

    一.认识二叉树 首先,在了解 mysql 中的 B+ 树之前,我们需要搞懂什么是二叉树.二叉树是一种常见的非线形数据结构,数据是以一对多的形态组织起来的,我画了一张图来帮助你理解: 在二叉树中,有一种 ...

  9. 【mysql innodb索引结构B+树】

    [mysql innodb索引结构B+树] 为什么Mysql中Innodb的索引结构采取B+树? B树 B树的两个明显特点 树内的每个节点都存储数据 叶子节点之间无指针相邻 B+树 B+树的两个明显特 ...

  10. geotools应用-JTS生产四叉树索引和R树索引

    微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 geotools介绍 geotools官网https://geotools.org/ Geotools是一个java类 ...

最新文章

  1. 粤桂粤黔协作签约-丰收节交易会·李喜贵:谋定一县一园产业园
  2. Microsoft Expression Blend Preview for Silverlight 5新版发布
  3. 决策树模型 - (ID3算法、C4.5算法) - Python代码实现
  4. 关于div的定位属性问题
  5. Visual Studio 2015编译wxWidgets
  6. bat中的[%~dp0]使用
  7. 我的世界java版刷铁机_我的世界:教你建造新版本中最简单的刷铁机,效率高人人学的会...
  8. 毕向东java基础,B站直达,目录,b站浏览目录太难受,在这做一个
  9. 精睿ESET_VC52_UPID获取器(8.25更新4.2.2.0)
  10. C++实现金山打字通助手
  11. JavaScript的优势和劣势
  12. 为什么工资高的程序员很少炫富?
  13. 显示控件——图标类之图标旋转
  14. 基于树莓派+STM32+OneNET云平台打造智能家居系统(一)硬件设计篇
  15. 实践中 XunSearch(讯搜)的使用教程步骤
  16. 如何将编译好的Docker镜像推送至私有Dockerhub仓库?
  17. 永远不可能学会的数论之基础数论(例题)
  18. 泰课在线Unity3d 动作游戏全攻略——有素材和代码
  19. 对比学习(Contrastive Learning)的理解
  20. java update()方法代码_Java Datastore.update方法代码示例

热门文章

  1. angular input_快速地上手Angular组件开发
  2. 这样的问题代码,我实习的时候都写不出来!
  3. 吊炸天的 Kafka 图形化工具 Eagle,必须推荐给你!
  4. 关于HashMap容量的初始化,还有这么多学问。
  5. JEECG支付服务窗专题 - 平台与服务窗接口对接
  6. Jeecg引领企业开发潮流,开启插件开发时代,微信企业号插件(jeecg-p3-biz-qywx)首次发布
  7. 马尔科夫随机场之图像分割【二】
  8. 财经数据提取器上线拉
  9. Vue学习笔记(5)(Vuex)
  10. Kubernetes三周年,这仅仅是伟大征途的开始