B-树的删除操作
看完你能逐情形推导任意删除引发的下溢与再平衡
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
B-树的删除操作
看完你能逐情形推导任意删除引发的下溢与再平衡
删除的本质挑战
为什么删除比插入更复杂
删除算法的全局框架
想象整理书柜:你先按书名目录找到位置,抽走它,回头发现那一层书架太空还得重新分发或合并。B-树删除一个关键字,整体就跑着「搜索—删除—修复」三段流程。
按目录定位(搜索)、抽走书(删除)、书架太空借位或合并相邻架(修复)
删除决策树
三次判断决定走哪条处理路径
情况一:删除叶子节点
上页决策树的第一步就是「目标在叶子节点」。这是所有情况里最轻松的一种,因为叶子没有孩子要照顾,删除只是从一段有序序列里去掉一个元素。
架子够稳就不必动整排,叶够格就不动父节点
情况二:删除内部节点
情况一我们搞定了叶子——直接删就行。但内部节点有左右子树,直接抽掉会让孩子节点悬空。这一页看怎么把它转成叶子再删。
经理岗位不空,由排序紧邻的下属接任,下属原位腾空再清理
内部节点删除的三种策略
三条路径做同一件事:找叶子里的键覆盖 k,再走叶子删除。差异只在「去哪儿找」。
后继节点替换的具体步骤
用右子树最小节点替换原值,再在叶子层把它删掉,分四步走。
什么是下溢
前几页我们解决了「删谁」的问题——叶子直接删,内部用后继替换。但真正把关键字拿走后,被波及的节点可能瞬间变薄。薄到什么程度算异常?这就是下溢。
库存低于下限就算空仓,要么调货要么并仓
下溢的边界情况
上页讲到下溢是节点关键字数跌破下限。但根节点是个例外——它是树的'特殊公民',可以比别的节点更少。这条豁免背后,藏着 B-树高度收缩的机制。
部门至少留 t-1 人,老板哪怕只剩一人公司也不倒;老板走了,公司缩编一层
旋转:向兄弟借节点
下溢发生后,合并并非唯一选择。当相邻兄弟还有富余时,旋转借一个就能补齐——这是处理下溢代价最小的路径。
兄弟部门出员到经理位=兄弟关键字入父节点;经理下来补人=父关键字下移填补
左旋与右旋的详细过程
图分两支:右旋向左兄弟借,左旋向右兄弟借。每条路径3步:父key下沉、兄弟key上移、兄弟子树挂载。
合并:与兄弟节点合并
当删除后非根节点少于 B-树允许的最少关键码数,且相邻兄弟也没有多余关键码时,借位不再安全,只能把两片节点合成一片,再把父节点中的分隔关键码放下来。
两节都无余位时,父节点的分隔牌放入中间,再合成一节
合并操作的详细过程
决策入口先判能否旋转,否则进入合并;合并三步走,父节点下溢则递归向上。
旋转与合并的抉择条件
从下溢出发,依次问左、右兄弟是否富余,能借则旋,不能借则合。
实例:删除叶子节点
用流程图展示m=3 B-树删除叶子节点且不引发下溢的完整路径,重点观察keys数≥2这一安全判据。
实例:删除引发旋转修复
流程图:跟踪一棵5阶B树删除键后,从下溢发生到左旋修复的完整步骤。
实例:删除引发合并修复
从叶子下溢开始,跟随流程看无法旋转时如何用合并修复B-树。
实例:删除内部节点
用后继节点替换并触发下溢修复的完整过程
实例:连锁下溢修复
沿主路径追踪合并后的连锁反应:从叶子一路传到根。
插入与删除的对称性
插入与删除的修复看似对称,实则方向相反——一页看清镜像关系
- 键数超过上限 m-1
- 分裂节点,中位键上推
- 修复向上传递,可连锁
- 键数低于下限 ⌈m/2⌉-1
- 借键旋转 或 合并兄弟
- 修复向上传递,可连锁
平衡的代价与收益
B-树删除时要旋转、合并、还可能一路向上连锁修复——这些操作并不便宜。为何不删完先放着,等下次查询时再顺手修?这关系到 B-树的核心设计哲学。
取下一本就归位——B-树删一个就修一个,写时多费事,读时永远顺手
核心要点回顾
- ✓下溢修复首选旋转,旋转不行才合并
- ✓内部节点删除通过后继替换转为叶子删除
- ✓下溢可能沿路径向上连锁传播至根
- ✓删除是插入的镜像但更复杂
课后思考
先独立思考三分钟,再对照参考答案看自己的思路是否命中要害。
参考答案当兄弟节点也只剩 t-1 个键时,无法借出,只能合并;合并使父节点少一个键,递归向上传播,直到根。
参考答案优先旋转,因为它保持树高不变、O(1) 完成;仅当兄弟也处于下限才合并(会降低树高)。t 越大,下限越宽松,旋转机会越多。
参考答案基本思路成立,但内部节点的删除不能就地完成,必须用叶节点中的后继替换——所有删除最终都落到叶子上,下溢修复逻辑保持一致。