B树的删除操作

把B树压缩成数组的结构, 二维的树是由 一维的数组 进化(拉伸)而来的,所以我们先还原成 一维数组 可以简化对删除操作的思考(如前趋值、后趋值的概念就是一维数组中的)。


实质上,B树的删除和二叉树的删除很相似,都是用其左/右分支的最大值/最小值来覆盖(删除)当前要删除的关键字,然后再递归删除此左/右分支的此关键字。

而无论是二叉树还是B树,也无论是删除还是插入,最后的任务都落在叶子结点上!

首先,每次删除开始之前,我们考查根结点,看是否符合合并的规则,如果合并,此时树的高度减1,这是树高度减少的唯一途径,此外合并也是为了应付要删除的关键字也可能就是根结点的情况。

接着,从根(如果合并就从新的根开始)开始删除,查找当前结点。

在删除的过程中,可能会出现两种情况,

           1)要删除的关键字在当前结点中,如果其左/右分支的根结点(下一次递归新的根结点)的关键字个数至少为 t 个(也是为了★),就用其左/右分支的最大值/最小值来覆盖(删除)当前要删除的关键字,然后再递归删除此左/右分支的此关键字(以此左/右分支的根结点为新的根,★);如果都为 t -1 个,就不能保证在下次递归调用时包括关键字的子树根(新的根)的关键字数至少为t(除了根结点外),所以应该根结点下拉合并再删除。这么做的目的是不破坏B树的结构,就像二叉树的删除一样。

           2)要删除的关键字不在当前结点中,但是我们可以确定关键字所在的(当前结点的)分支。看此分支根结点关键字个数是否等于 t - 1 个,如果是,就向兄弟结点经父节点借关键字(向左借/向右借/下拉合并)——(借过之后,所借的兄弟结点的关键字个数减1,所以要保证所借结点的关键字个数至少是 t ,否则就要把根结点关键字下拉合并),借和合并的目的也是为了保证在下一次递归时新的根关键字个数至少为 t 。然后以此左/右分支的根结点为新的根(也是至少为 t )递归向下查找。

当然如果至少为 t 个,不借也不合并了,递归向下删除即可。

这么做,都是为了保证此分支的根结点的关键字个数至少为 t ,从而为将来可能发生的下拉做好准备。


★:从上面可以看出,我们必须时刻保证包含要删除关键字的根结点的关键字数量至少为t,这样做就是为了确保合并的成功(所谓合并,就是根结点的一个关键字下拉到此关键字的左子结点中且把右子结点合并到左子结点中——当然,前提是此时左结点无法从其相邻兄弟结点借关键字,即相邻兄弟结点的关键字个数皆为 t - 1 个)。使得在每次递归调用前,程序都能保证包括关键字的子树根的关键字数至少为t(除了根结点外)。


具体做法如下:

在删除B树节点时,为了避免回溯,当遇到需要合并的节点时就立即执行合并,B树的删除算法如下:从root向叶子节点按照search规律遍历:
(1)  如果target在叶节点x中,则直接从x中删除target,情况(2)和ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值