数据结构-B树删除示例

1、B树简介

  1970年,R.Bayer和E.mccreight提出了一种适用于外查找的树,它是一种平衡的多叉树,称为B树(或B-树、B_树)。一棵m阶B树(balanced tree of order m)是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:
  1、根结点至少有两个子女;
  2、每个非根节点所包含的关键字个数 j 满足:⌈ m/2⌉ - 1 <= j <= m - 1;
  3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:⌈ m/2⌉ <= k <= m ;
  4、所有的叶子结点都位于同一层。
  在B-树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,该k-1个关键字正好是k个孩子包含的关键字的值域的分划。
  因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总个数加1。
  B-树中的一个包含n个关键字,n+1个指针的结点的一般形式为:(n,P0,K1,P1,K2,P2,…,Kn,Pn)。其中,Ki为关键字,K1<K2<…<Kn, Pi 是指向包括Ki到Ki+1之间的关键字的子树的指针。
  ------粘百度百科

2、在线可视化生成B树工具

  网址是:https://www.cs.usfca.edu/~galles/visualization/BTree.html

3、B树删除规则

在这里插入图片描述

4、B树删除示例

  看一个具体例子,这里是以五阶B树为例,
  对于五阶B树来说:
    其中根结点关键字个数 j 满足:1 <= j <= m - 1,也就是1 ~ 4;
    其中非根结点关键字个数 j 满足:⌈ m/2⌉ - 1 <= j <= m - 1,也就是2 ~ 4;
    其中根结点子树个数 k 满足:2 <= j <= m ,也就是2 ~ 5;
    其中子结点子树个数 k 满足:⌈ m/2⌉ <= k <= m,也就是3 ~ 5。

4.1、删除非根结点示例

  关键字序列为(1,2,3,4,5,6,9,11,12,23,25,30,40,43,44,46,48,49,50,51,52,56,58,59,60,64,65,66,70,72,73,89),其中绿色的图是在线可视化生成B树工具运行结果。
  1、B树插入这里不介绍,构建完成后如图4-1所示。

在这里插入图片描述

图4-1

  2、删除关键字“60”,删除后如图4-2所示。

  图中步骤②,是根据B树删除规则中第①个【先用其直接前驱(关键字“59”(替代是先左后右))替代其位置】
  图中步骤③,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“58”)需要与父结点内的关键字(关键字是“56”)和左兄弟(关键字是“51、52”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数未低过下限(五阶B树非根结点的关键字个数下限是2),无需继续调整合并】

在这里插入图片描述

图4-2

  3、删除关键字“66”,删除后如图4-3所示。

  图中步骤②,根据B树删除规则中第①个【先用其直接前驱(关键字“65”(替代是先左后右))替代其位置】
  图中步骤③和步骤④,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“59”)、前驱的前驱(关键字是“58”)依次顶替空缺】

在这里插入图片描述

图4-3

  4、删除关键字“65”,删除后如图4-4所示。

  图中步骤②,根据B树删除规则中第①个【先用其直接前驱(关键字“64”(替代是先左后右))替代其位置】
  图中步骤③和步骤④,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“58”)、前驱的前驱(关键字是“56”)依次顶替空缺】

在这里插入图片描述

图4-4
  5、删除关键字“59”,删除后如图4-5所示。

  图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“64”)、后继的后继(关键字是“70”)依次顶替空缺】

在这里插入图片描述

图4-5
  6、删除关键字“58”,删除后如图4-6所示。

  图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“70”)、后继的后继(关键字是“72”)依次顶替空缺】

在这里插入图片描述

图4-6
  7、删除关键字“51”,删除后如图4-7所示。

  图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“52”)需要与父结点内的关键字(关键字是“56”)和右兄弟(关键字是“64、70”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整合并】
  图中步骤③和步骤④,是根据B树删除规则中第①个【先用其直接前驱(关键字“50”(替代是先左后右))替代其位置】,替代后合并关键字“40、46、50、72”即可

在这里插入图片描述

图4-7
  8、删除关键字“89”,删除后如图4-8所示。

  图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“72”)、前驱的前驱(关键字是“70”)依次顶替空缺】

在这里插入图片描述

图4-8
  9、删除关键字“11”,删除后如图4-9所示。

  图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“9”)、前驱的前驱(关键字是“6”)依次顶替空缺】

在这里插入图片描述

图4-9
  10、删除关键字“4”,删除后如图4-10所示。

  图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“5”)需要与父结点内的关键字(关键字是“3”)和左兄弟(关键字是“1、2”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整】
  图中步骤③,是根据B树删除规则中第①个【先用其直接前驱(关键字“23”(替代是先左后右))替代其位置】
  图中步骤④,是根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“40”)顶替空缺】

在这里插入图片描述

图4-10
  11、删除关键字“48”,删除后如图4-11所示。

  图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“50”)、后继的后继(关键字是“52”)依次顶替空缺】

在这里插入图片描述

图4-11
  12、删除关键字“25”,删除后如图4-12所示。

  图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“30”)需要与父结点内的关键字(关键字是“23”)和左兄弟(关键字是“9、12”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整】
  图中步骤③,是根据B树删除规则中第①个【先用其直接前驱(关键字“40”(替代是先左后右))替代其位置】
  图中步骤④,是根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“46”)顶替空缺】

在这里插入图片描述

图4-12
  13、删除关键字“73”,删除后如图4-13所示。

  图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“72”)需要与父结点内的关键字(关键字是“70”)和左兄弟(关键字是“56、64”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续调整】
  图中步骤③和步骤④,是根据B树删除规则中第①个【先用其直接前驱(关键字“46”(替代是先左后右))替代其位置】,替代后合并关键字“6、40、46、52”即可

在这里插入图片描述

图4-13
  14、删除关键字“43”,删除后如图4-14所示。

  图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“40”)、前驱的前驱(关键字是“30”)依次顶替空缺】

在这里插入图片描述

图4-14
  15、删除关键字“70”,删除后如图4-15所示。

  图中步骤①,根据B树删除规则中第②个【删除后结点关键字的个数未低于下限,直接删除,无需任何处理】

在这里插入图片描述

图4-15
  16、删除关键字“50”,删除后如图4-16所示。

  图中步骤②和步骤③,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“52”)、后继的后继(关键字是“56”)依次顶替空缺】

在这里插入图片描述

图4-16
  17、删除关键字“40”,删除后如图4-17所示。

  图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“30”)、前驱的前驱(关键字是“23”)依次顶替空缺】

在这里插入图片描述

图4-17
  18、删除关键字“9”,删除后如图4-18所示。

  图中步骤②和步骤③,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“6”)、前驱的前驱(关键字是“5”)依次顶替空缺】

在这里插入图片描述

图4-18
  19、删除关键字“1”,删除后如图4-19所示。

  图中步骤①,根据B树删除规则中第②个【删除后结点关键字的个数未低于下限,直接删除,无需任何处理】

在这里插入图片描述

图4-19
  20、删除关键字“30”,删除后如图4-20所示。

  图中步骤②,是根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“44”)需要与父结点内的关键字(关键字是“23”)和左兄弟(关键字是“6、12”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数未低过下限(五阶B树根结点的关键字个数下限是1),无需继续调整】

在这里插入图片描述

图4-20
  21、删除关键字“5”,删除后如图4-21所示。

  图中步骤②,根据B树删除规则中第③个【右兄弟够借,则用当前结点的后继(关键字是“6”)顶替空缺】

在这里插入图片描述

图4-21
  22、删除关键字“56”,删除后如图4-22所示。

  图中步骤②,根据B树删除规则中第①个【先用其直接前驱(关键字“52”(替代是先左后右))替代其位置】
  图中步骤③和步骤④,根据B树删除规则中第④个【左兄弟够借,则用当前结点的前驱(关键字是“46”)、前驱的前驱(关键字是“44”)依次顶替空缺】

在这里插入图片描述

图4-22
  23、删除关键字“6”,删除后如图4-23所示。

  图中步骤②,是根据B树删除规则中第①个【先用其直接前驱(关键字“23”(替代是先左后右))替代其位置】和第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“12”)需要与父结点内的关键字(关键字是“23”)和左兄弟(关键字是“2、3”)进行合并,合并后导致根结点关键字数量-1,数量-1后根结点中关键字个数未低过下限(五阶B树根结点的关键字个数下限是1),无需继续合并】

在这里插入图片描述

图4-23

4.2、删除根结点示例

  关键字序列为(1,2,12,22,23,33,34,132,213,321,342,343,344,676,788,898,2323,5656,5659),其中绿色的图是在线可视化生成B树工具运行结果。这里是为了单独演示删除根结点操作步骤:
  1、B树插入这里不介绍,构建完成后如图4-24所示。
在这里插入图片描述

图4-24

  2、删除关键字“342”,删除后如图4-25所示。

  根据B树删除规则中第①个【先用其直接前驱(关键字“321”(替代是先左后右))替代其位置】和第③个【左兄弟够借,则用当前结点的前驱(关键字是“132”)、前驱的前驱(关键字是“34”)依次顶替空缺】

在这里插入图片描述

图4-25

  3、删除关键字“321”,删除后如图4-26所示。

  根据B树删除规则中第①个【先用其直接前驱(关键字“213”(替代是先左后右))替代其位置】和第③个【左兄弟够借,则用当前结点的前驱(关键字是“34”)、前驱的前驱(关键字是“33”)依次顶替空缺】

在这里插入图片描述

图4-26

  4、删除关键字“213”,删除后如图4-27所示。

  根据B树删除规则中第①个【先用其直接前驱(关键字“132”(替代是先左后右))替代其位置】和第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“34”)需要与父结点内的关键字(关键字是“33”)和左兄弟(关键字是“22、23”)进行合并,合并后导致父结点关键字数量-1,数量-1后父结点中关键字个数低过下限(五阶B树非根结点的关键字个数下限是2),需要继续合并】
  再次根据B树删除规则中第⑤个【左、右兄弟都不够借,则(当前结点剩余关键字“12”)需要与父结点内的关键字(关键字是“132”)和右兄弟(关键字是“676、2323”)进行合并,合并后无需继续合并】

在这里插入图片描述

图4-27

  以上就是B树删除的全部过程,涵盖了所有情况。

  • 19
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值