2-3查找树(二):插入

1. 插入简介

2-3树插入的大致思路和BST是一致的,所以我们现在主要需要思考这样一个问题:

如何插入才能随时保证2-3树都能保持完美平衡?

我们通过观察可以发现:1

  1. 如果未命中的查找结束于一个2-结点,我们只要把这个2-结点替换成一个3-结点即可;(如博主之前介绍的那样)
  2. 如果未命中的查找结束于一个3-结点,那么就要分情况讨论;

那么接下来,我们就分情况讨论插入操作。

2. 分情况插入

2.1 向2-结点中插入新键

这种情况最简单,只需要把原来的2-结点变成3-结点即可。大家可以看看下面这个图例1进行理解:

在这里插入图片描述

2.2 向一棵只含有一个3-结点的树中插入新键

这种情况,我们先把原先的3-结点变成一个临时4-结点,然后对4-结点进行拆分,拆分成3个2-结点即可。4-结点的定义和3结点类似,只是它有三个键,4条链接。临时4结点经过拆分之后,我们注意到1

变化后的树,既是一棵含有3个2-结点的BST,同时也是一课完美平衡的2-3树,因为其中所有的空链接到根结点的距离都相等。插入前树的高度是0,插入后树的高度为1.

这个例子很简单,但它说明了2-3树是如何生长的。同样,大家可以看看下面这个图例1进行理解:

在这里插入图片描述

2.3 向一个父结点为2-结点的3-结点中插入新键

对于这种情况,我们先往3-结点中插入,然后变换成一个临时4-结点,然后将4-结点中的中键(大小居中的键),往其父结点移动,也就是把2-父结点变成一个3-父结点。通过这种往父级“踢皮球”的方式,解决插入后的平衡问题。

这种变换非常的重要,它是2-3树动态变化的核心。同样,大家可以看看下面这个图例1进行理解:

在这里插入图片描述

2.4 向一个父结点为3-结点的3-结点中插入新键

插入的最后一种情况就是,插入结点和其父结点都是3-结点。这种情况和 2.3 的处理方法是类似的,把插入的3-结点变成临时4-结点,然后把插入后的临时4-结点中的中键,“踢皮球”扔给其3-父结点。3-父结点接受子节点“踢”来的中键,变成临时4-结点。到此,新临时4-父结点进行和上面相同的变换,即分解这个父结点,并将它的中键“踢”向它的父结点中去。

推广到一般情况,我们就这样一直向上不断分解临时的4-结点,并将中键插入到更高层的父结点中,直至遇到一个2-结点并将它替换为一个不需要继续分解的3-结点,或者是达到3-结点的根。1

同样,大家可以看看下面这个图例1进行理解:

在这里插入图片描述

2.5 分解根节点

2.4 中,如果向上经过的父结点全是3-结点,那么我们会一直重复“向上插入 - 分解”,直至遇到3-根结点。那么同样,我们将3-根节点变换成4-结点,然后对其进行分解。这时我们发现,我们不用再向上插入中键了,因为根已经是最顶级的结点,而且分解根,左右两边所有子树的高度都 + 1,所以整棵树依然是平衡的 —— “众生皆平等”原则。

同样,大家可以看看下面这个图例1进行理解:

在这里插入图片描述

2.6 插入总结

上面插入操作那么繁多,看的眼花缭乱啦哒。所以这里总结以下2-3树插入操作的特点:

  1. 如果插入位置是2-结点,直接插入就行,把原先的2-结点变成3-结点;
  2. 如果插入位置是3-结点,将原先的3-结点变成4-结点。然后分情况分解,如果当前位置不是根结点,则将中键“踢”给父级解决;如果当前位置是根结点,直接但4-结点分解为3个2-结点即可;

至此,2-3树的插入操作都已经讲解完毕。接下来,我们将讲解2-3树的局部变换和全局性质,以及给到一个完整的2-3树构造轨迹图例。


上一节:2-3查找树(一):基本概念
下一节:2-3查找树(三):全局性质和轨迹图例
系列汇总:超详细!红黑树详解文章汇总(含代码)

3. 特别感谢

  1. 感谢 @SENNICHEN 制作系列文章封面图

4. 免责声明

※ 本文之中如有错误和不准确的地方,欢迎大家指正哒~
※ 此项目仅用于学习交流,请不要用于任何形式的商用用途,谢谢呢;


在这里插入图片描述


  1. Algorithms 4th Edition ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
定义B-存储结构(要求m3;为方便操作,结点中增加双亲结点指针域,最底层的Fail结点用NULL指针表示并且所有结点均存储于内存)。定义B-插入关键字函数、删除关键字函数、查找关键字函数以及按层次遍历输出B-所有结点的函数。主函数定义菜单(1.插入关键字 2.删除关键字 3. 查找关键字 4.层次遍历输出B-所有结点 5.结束程序)。 1. 插入关键字功能的输入为一个关键字,输出为新插入关键字所在结点的信息。 要求结点信息输出格式如下所示: (R102, n, K1, K2, …, Kn) R102表示结点位置,R表示根结点指针;第一个数字1表示根结点的A[1]指针,第个数字0表求R->A[1]所指结点的A[0]指针,第三个数字2表示R->A[1]->A[0]所指结点的A[2]指针,即该结点指针为: R->A[1]->A[0]->A[2](该结点在第4层上)。n为该结点的关键字数目,K1, K2, …, Kn为该结点中n个非递减有序的关键字。 2. 删除关键字功能的输入为一个关键字,输出为删除成功与失败的信息。 3. 查找关键字功能的输入为一个关键字,输出为查找成功与失败的信息,查找成功时,应输出关键字所在结点信息(结点信息输出方法同1.)。 4. 按层次遍历输出B-所有结点功能的输入为一个字符文件名,输出为该字符文件,字符文件中,一个结点的信息输出一行(结点信息输出方法同1.),结点输出次序为按层次号由小到大并且同层结点从左向右。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值