B 树
什么是 B 树?
B 树 (_B-Tree_)
是一种 平衡多路搜索树,通常用于文件系统、数据库中。
m 阶 B 树
的 m 代表的是树中一个节点最多可以有 m 个子节点。若 m 阶 B 树一个节点有 个元素,该节点有 个子节点,则有:
- 对于根节点:
- 对于非根节点:
如下图,是一颗 3 阶 B 树。
上溢和下溢
什么是上溢?
阶 B 树的某个节点的元素个数等于 时,称为 上溢。出现上溢时,要对 B 树进行调整,以重新满足 B 树的性质。
上溢的解决 方法如下:
- 将上溢节点的中间的元素合并到父节点中,上溢节点分裂为两个父节点的子节点
- 如果父节点继续出现上溢,则继续向上合并
- 如果最后根节点出现上溢,则将节点中间的元素作为新的根节点
下图展示了上溢调整的具体过程:
如果上溢节点的元素个数为偶数,可以选择中间两个元素的任意一个向上合并。
什么是下溢?
和上溢相对应, 阶 B 树的某个节点的元素个数不足时(对于根节点,元素个数为 0 ;对于非根节点,元素个数为 ),称为 下溢 。
下溢的解决方法 如下:
- 如果(相邻的)兄弟节点能够借出一个元素(),则将下溢节点和兄弟节点之间的父元素加入到下溢节点中,并用兄弟借出的元素代替父元素。如下图所示:
如果够借,为了保证二叉搜索树的性质,相邻左兄弟借出最大元素,相邻右兄弟借出最小元素。
- 如果(相邻的)兄弟节点不够借,则将父元素向下合并为一个新的节点。
需要注意的是,父元素向下合并可能导致父节点出现下溢,要对父节点再次进行调整,直到根节点出现下溢。
上溢和下溢总结
- 上溢直到根节点,树的高度增加 1
- 下溢直到根节点,树的高度降低 1
B 树的基本操作
添加元素
B 树的添加元素总是添加在叶子节点中。
如果添加到叶子节点中没有上溢,直接添加即可。如果添加到叶子节点中出现上溢,进行上溢调整。
删除元素
删除元素过程中,真正删除的元素总是在叶子节点中。叶子节点删除元素后,如果出现下溢,需要进行下溢调整。
如果删除的元素不在叶子节点中,用该元素的 前驱(后继) 代替,再删除前驱(后继)。
前驱是中序遍历的前一个元素,后继是中序遍历的后一个元素。
查找元素
查找元素首先在节点中按顺序查找,如果命中,结束查找。否则在对应的子节点中继续查找。
3 阶 B 树
3 阶 B 树又称为 2-3 树
,每个节点只能有一个元素(这种节点称为 2 节点)或两个元素(称为 3 节点)。
2-3 树的性质:
- 高度为 的 2-3 树的节点个数至少为
- 叶子节点在同一层
第二条性质也是 B 树的通用性质。
4 阶 B 树
4 阶 B 树也称 2-3-4 树
,每个节点可以有 1 或 2 或 3 个元素。
4 阶 B 树和红黑树具有等价性。
总结
无论是几阶 B 树,只要明白 B 树的定义和性质 以及 上下溢的处理方法,就能以不变应万变,玩转插入删除等操作了。