约 1300 字
B树
基本概念
B树中,结点中的孩子结点个数的最大值为B树的阶 m,并满足如下一些性质:
每个结点最多有 $m$ 个子树,最少有 $\lceil m/2 \rceil$ 个分支。特殊的,根结点若不是叶子,则最少有 2 个分支
若一个结点有 $n-1$ 个关键字,则有 $n$ 个分支。且关键字递增排列。关键字和孩子结点的关系如下:
其中,$n$ 为关键字的个数,ki 为关键字且满足ki<ki+1,pi为孩子结点的指针且所指结点的关键字满足 ki<pi<ki+1
根据1和2,可知结点最多有 $m-1$ 个关键字,最少有 $\lceil m/2 \rceil-1$ 个关键字。(特殊的,根可以只有1个关键字)
叶子结点处于同一层,可以用空指针表示,是查找失败到达的位置。(也就是叶子结点全都是空结点)
(根据上一条)B树是平衡的
B树的查找
从根结点出发,
- 先查找结点内的关键字
- 若找不到,则在对应范围内查找
B树的插入
- 定位:找到最低层中的某个非叶结点
- 插入:若插入后,关键字个数大于 $m-1$(即子树大于 $m$),则分裂,否则完成插入。
- 分裂:以 $\lceil m \rceil$ 关键字进行划分,分为两个子结点,然后中间 $\lceil m \rceil$ 关键字则插入到父结点。若父节点超出 $m-1$,则继续分裂。
这个和2-3树是类似的。
B树的建立
- 首先确定树的阶数
- 先经可能地将根填满到 $m-1$
- 然后不断地插入
示例:5阶树
B树的删除
若删除的是非终端结点(即不是最低的非空结点),可以用前驱或后继代替,从而转化为删除终端结点的情况。
若删除的是终端结点,
删除后仍满足关键字个数大于 $\lceil m/2 \rceil-1$,则完成
反正,则向兄弟结点借,节的过程是:兄弟结点的最大/小值先代替父节点的一个关键字,再将父节点的关键字移到删除结点
若兄弟结点不够借(即关键字都刚好是 $\lceil m/2 \rceil-1$),则将被删结点、父结点中的关键字、兄弟结点组合成新结点(此时为 $m-1$ 个关键字)。删除后,父节点的关键字个数少1,若
- 父节点是根,且减少为0,则新结点成为新的根