B 树

568 阅读3分钟

image.png

B 树

什么是 B 树?

B 树 (_B-Tree_) 是一种 平衡多路搜索树,通常用于文件系统、数据库中。

m 阶 B 树 的 m 代表的是树中一个节点最多可以有 m 个子节点。若 m 阶 B 树一个节点有 xx 个元素,该节点有 yy 个子节点,则有:

  • m2m \ge 2
  • y=x+1y=x+1
  • 对于根节点:1xm11\le x \le m-1
  • 对于非根节点:m/21xm1\left \lceil m/2 \right \rceil-1 \le x \le m-1

如下图,是一颗 3 阶 B 树。

image.png

上溢和下溢

什么是上溢?

mm 阶 B 树的某个节点的元素个数等于 mm 时,称为 上溢。出现上溢时,要对 B 树进行调整,以重新满足 B 树的性质。

上溢的解决 方法如下:

  • 将上溢节点的中间的元素合并到父节点中,上溢节点分裂为两个父节点的子节点
  • 如果父节点继续出现上溢,则继续向上合并
  • 如果最后根节点出现上溢,则将节点中间的元素作为新的根节点

下图展示了上溢调整的具体过程:

B-Tree_overflow_adjust.gif

如果上溢节点的元素个数为偶数,可以选择中间两个元素的任意一个向上合并。

什么是下溢?

和上溢相对应,mm 阶 B 树的某个节点的元素个数不足时(对于根节点,元素个数为 0 ;对于非根节点,元素个数为 m/22\left \lceil m/2 \right \rceil -2),称为 下溢

下溢的解决方法 如下:

  • 如果(相邻的)兄弟节点能够借出一个元素(),则将下溢节点和兄弟节点之间的父元素加入到下溢节点中,并用兄弟借出的元素代替父元素。如下图所示:

B-Tree_underflow_adjust_case01.gif

如果够借,为了保证二叉搜索树的性质,相邻左兄弟借出最大元素,相邻右兄弟借出最小元素。

  • 如果(相邻的)兄弟节点不够借,则将父元素向下合并为一个新的节点。

B-Tree_underflow_adjust_case02.gif

需要注意的是,父元素向下合并可能导致父节点出现下溢,要对父节点再次进行调整,直到根节点出现下溢。

上溢和下溢总结

  • 上溢直到根节点,树的高度增加 1
  • 下溢直到根节点,树的高度降低 1

B 树的基本操作

添加元素

B 树的添加元素总是添加在叶子节点中

如果添加到叶子节点中没有上溢,直接添加即可。如果添加到叶子节点中出现上溢,进行上溢调整。

删除元素

删除元素过程中,真正删除的元素总是在叶子节点中。叶子节点删除元素后,如果出现下溢,需要进行下溢调整。

如果删除的元素不在叶子节点中,用该元素的 前驱(后继) 代替,再删除前驱(后继)。

前驱是中序遍历的前一个元素,后继是中序遍历的后一个元素。

查找元素

查找元素首先在节点中按顺序查找,如果命中,结束查找。否则在对应的子节点中继续查找。

3 阶 B 树

3 阶 B 树又称为 2-3 树,每个节点只能有一个元素(这种节点称为 2 节点)或两个元素(称为 3 节点)。

2-3 树的性质:

  • 高度为 hh 的 2-3 树的节点个数至少为 2h12^h - 1
  • 叶子节点在同一层

第二条性质也是 B 树的通用性质。

4 阶 B 树

4 阶 B 树也称 2-3-4 树,每个节点可以有 1 或 2 或 3 个元素。

4 阶 B 树和红黑树具有等价性

总结

无论是几阶 B 树,只要明白 B 树的定义和性质 以及 上下溢的处理方法,就能以不变应万变,玩转插入删除等操作了。