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

发布于:2024-09-18 ⋅ 阅读:(114) ⋅ 点赞:(0)


可以观看以下两个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:

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

1. 将他的父亲节点先借给他,将15移下来

在这里插入图片描述
2.之后再把它旁边的兄弟移上去
在这里插入图片描述那这样的话就是我们借的方式了

样例2:

在这里插入图片描述
这是一个三阶子树,他的区间范围是【1-2】

​   所以如果我们要删除60.则要先把它父亲先借下来,之后再将它兄弟移上去就行了

​   也就是先删除 60 这个节点 ,然后再把父亲 80 这个节点再移动到原本被删除的位置,然后再将它兄弟节点 90 这个节点移回它付清这个节点


☁️ 以上就是所有内容,对大家有用的话点个关注!感谢大家!

往期回顾

1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》
14.【第三章】《二叉树链式结构及实现1》
15.【第三章】《二叉树链式结构及实现2》
16.【第三章】《二叉树链式结构及实现3》
17.【第三章】《二叉树链式结构及实现4》
18.【第三章】《二叉树链式结构及实现5》
19.【第三章】《中序线索二叉树理论部分》
20.【第三章】《中序线索二叉树代码初始化及创树》
21.【第三章】《中序线索二叉树线索化及总代码》
22【第三章】《先序线索二叉树理论及线索化》
23【第三章】《先序线索二叉树查找及总代码》
24【第三章】《后续线索二叉树线索化理论》
25【第三章】《后续线索二叉树总代码部分》
26【第三章】《二叉排序树基础了解》
27【第三章】《二叉排序树代码部分》
28【第三章】《二叉排序树代码部分》
29【第三章】《平衡二叉树基础概念》
30【第三章】《平衡二叉树的平衡因子》
31【第三章】《平衡二叉树的旋转基础详解》
32【第三章】《平衡二叉树的旋转类型图文详解》
33【第三章】《平衡二叉树的旋转类型总结及总代码》
34【第三章】《哈夫曼树简单了解》
35【第三章】《哈夫曼树的构造方法》
36【第三章】《哈夫曼编码构造及代码》
37【第四章】《图的定义》
38【第四章】《图的基本概念和术语》
39【第四章】《图的存储结构》
40【第四章】《图的遍历之深度优先遍历》
41【第四章】《广度优先遍历BFS》
42【第四章】《图的遍历总代码》
43【第四章】《最小生成树概念》
44【第四章】《最小生成树的应用举例》
45【第四章】《prim算法(普里姆算法)详解》
46【第四章】《prim算法(普里姆算法)详解2》
47【第四章】《prim算法(普里姆算法)详解3》
48【第四章】《prim算法(普里姆算法)讲解汇总》
49【第四章】《prim算法(普里姆算法)代码讲解》
50【第四章】《prim算法(普里姆算法)总代码》
51【第四章】《克鲁斯卡尔算法思路介绍》
52【第四章】《克鲁斯卡尔算法步骤思路1》
53【第四章】《克鲁斯卡尔算法步骤思路2》
54【第四章】《克鲁斯卡尔算法应用场景-公交站问题》
55【第四章】《克鲁斯卡尔算法判断回路问题》
56【第四章】《克鲁斯卡尔算法步骤回顾》
57【第四章】《克鲁斯卡尔算法代码初始化详解》
58【第四章】《克鲁斯卡尔算法总代码详解》
59【第四章】《了解最短路径》
60【第四章】《迪杰斯特拉算法了解》
61【第四章】《Dijkstra 迪杰斯特拉算法图解》
62【第四章】《Dijkstra 迪杰斯特拉算法总代码》
63【第四章】《弗洛伊德(floyd)算法简介》
64【第四章】《弗洛伊德算法详解》
65【第四章】《弗洛伊德代码详解》
66【第四章】《拓扑排序之AOV网》
67【第四章】《拓扑排序介绍及其方法》
68【第四章】《拓扑排序代码详解》
69【第四章】《什么是关键路径》
70【第四章】《什么是关键路径二》
71【第四章】《关键活动与最早路径实现思想》
72【第四章】《关键活动与最早路径实现思想写法二》
73【第四章】《关键路径总代码讲解写法一》
74【第四章】《关键路径总代码讲解写法二》
75【第五章】《顺序查找》
76【第五章】《顺序查找-带哨兵》
77【第五章】《二分查找》
78【第五章】《B树了解以及定义》
79【第五章】《B树的插入例子1》
80【第五章】《B树的插入例子2》


网站公告

今日签到

点亮在社区的每一天
去签到