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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值