B树
B树(B-Tree、B-树)
- B树是一种平衡的多路搜索树,多用于文件系统、数据库的实现
示例:
- B树特点:
- 一个节点可以存储超过两个元素,可以拥有超过两个子节点
- 拥有二叉搜索树的一些性质
- 平衡,每个节点的所有子树高度一致
- 比较矮的树
M阶B树的性质(M>=2)
假设一个节点存储的元素个数为x
- 根节点元素个数:1 <= x < M-1
- 非根节点元素个数:M/2 - 1 <= x <= M-1
- 如果有子节点,子节点个数y = x+1
B树 VS 二叉搜索树
- B树和二叉搜索树,在逻辑上是等价的
- 多代节点合并,可以获得一个超级节点
- 二代合并的超级节点,最多拥有四个子节点(至少是4阶B树)
- 三代合并的超级节点,最多拥有八个子节点(至少是8阶B树)
- n代合并的超级节点,最多拥有2n个子节点(至少是2n阶B树)
- M阶B树,最多需要log2M代合并
搜索
- 先在节点内部从小到大开始搜索元素
- 如果命中,搜索结束
- 如果未命中,再去对应子节点中搜索元素,重复步骤1
添加
添加元素必定是添加到叶子节点
添加55
添加95
- 如果此时再插入98(假设这是一颗4阶B树)
- 最右下角的叶子节点的元素个数将超过限制
- 这种现象可以称之为:上溢(overflow)
上溢的解决(假设5阶B树)
- 上溢节点的元素个数必然等于M
- 假设上溢节点最中间元素的位置为k
- 将k位置的元素向上与父节点合并
- 将[0,k-1]和[k+1,m-1]位置的元素分裂成两个子节点(这两个子节点的元素个数,必然不会低于最低限制:M/2-1)
- 一次分裂完毕之后,也可能导致父节点上溢,依然按照上述方法解决
- 最极端情况可能会一直上溢到根节点
- 添加导致的上溢实例:
删除
-
叶子节点
若需要的删除的元素在叶子节点中,那么直接删除即可 -
非叶子节点
若需要的删除的元素在非叶子节点中:1.先找到前驱或后继节点,覆盖所需删除元素的值;2.再把前驱或后继元素删除
示例:
注意:非叶子节点的前驱或后继元素,必定在叶子节点中,所以这里的删除前驱或后继元素,就是开始提到的情况:删除的元素在叶子节点中,真正的删除元素都是发生在叶子节点中。 -
删除-下溢
叶子节点被删除掉一个元素之后,元素个数可能会低于最低限制(>=m/2 - 1),这种现象被称之为:下溢(underflow)
下溢的解决
情况一:下溢节点的元素个数必然等于m/2 - 2,如果下溢节点临近的兄弟节点,有至少m/2个元素,则可以向兄弟节点借一个元素。
将父节点的元素b插入到下溢节点的0位置(最小位置),用兄弟节点的元素a(最大元素)替代父节点的元素b。这个操作其实就是旋转。(如下图所示)
情况二:如果下溢节点临近的兄弟节点,只有m/2 - 1个元素,则将父节点的元素b挪下来跟左右子节点进行合并,合并之后的节点元素个数等于m/2 + m/2 - 2,不超过m-1。这个操作可能会导致父节点下溢,依然按上述方法解决,下溢现象可能会一直往上传播,直到根节点
(如下图所示)
示例:
此处介绍B树,是为了更好的进入红黑树的学习,因为红黑树的性质和4阶B树类似。