从零开始学数据结构系列之第五章《B树的删除》


可以观看以下两个UP的视频来先看看
B树的插入删除1
B树的插入和删除2

删除操作是指,根据key删除记录,如果B树中的记录中不存对应key的记录,则删除失败。

  1)如果当前需要删除的key位于非叶子结点上,则用后继key(这里的后继key均指后继记录的意思)覆盖要删除的key,然后在后继key所在的子支中删除该后继key。此时后继key一定位于叶子结点上,这个过程和二叉搜索树删除结点的方式类似。删除这个记录后执行第2步

  2)该结点key个数大于等于Math.ceil(m/2)-1,结束删除操作,否则执行第3步。

  3)如果兄弟结点key个数大于Math.ceil(m/2)-1,则父结点中的key下移到该结点,兄弟结点中的一个key上移,删除操作结束。

​   否则,将父结点中的key下移与当前结点及它的兄弟结点中的key合并,形成一个新的结点。原父结点中的key的两个孩子指针就变成了一个孩子指针,指向这个新结点。然后当前结点的指针指向父结点,重复上第2步。

​   有些结点它可能即有左兄弟,又有右兄弟,那么我们任意选择一个兄弟结点进行操作即可。

相比于插入,我们B树的删除就比较难理解了,总的来说我们分成3种情况

情况1

叶子结点的个数正好>最小值,直接删

这种就是最简单的删除方式了,因为待删除的节点中有足够的范围让自己去删除,所以就不用顾及那么多

案例1

我们直接看案例,注意案例都是五阶B树,区间是2-4

在这里插入图片描述
上面的B树中删除21,删除后结点中的关键字个数仍然大于等2,所以直接删除就行了。
在这里插入图片描述

案例2

原始状态
在这里插入图片描述

上面的B树中删除18,删除后结点中的关键字个数仍然大于等2,所以直接删除就行了。
在这里插入图片描述

情况2

叶子结点的个数正好=最小值,先去借,借不到就合并

原图:
在这里插入图片描述
  上面的B树中删除14,删除后结点中的关键字个数小于2,所以此时我们应该去找兄弟去借(如果兄弟有的话)

那问题是,我们要怎么借?
在这里插入图片描述

​   我们先看左边能不能借,发现如果向左边去借的话,那么左边兄弟子树也是不满足区间的(借了的话左边兄弟还剩一个,也不满足定义),那我们看看右边子树能不能借,发现右边子树是能去借的(右边子树借了之后还是满足再区间内的【2-4】个)

样例1:

那重点来了,我们要借的方式是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值