树04_B树

B树是一种平衡的多路搜索树,多用于文件系统、数据库的实现;

B树的特点

(1)高度平衡,每个节点的所有子树高度一致
(2)每个节点有n个元素,n+1个指针
(3)仍满足搜索树的特点

注意:B树的关键特征是指针个数是元素个数+1

m阶B树的性质

阶的意思是指针个数;
二阶B树 = 二叉搜索树
树04_B树_第1张图片
(1)根节点的元素个数: x ∈ [1,m-1]
(2)非根节点的元素个数:x ∈ [┌ m/2 ┐−1,m-1]
(3)当前节点的子节点的元素个数: y = x + 1

假设y∈[n,m] 那么又叫做: (n,m)树 m是阶数

数据库实现中一般用几阶B树?
200 ~ 300

B树 vs 二叉搜索树

B树和二叉搜索树,在逻辑上是等价的

1)二叉搜索树转B树

二叉搜索树多代节点合并,可以获得一个超级节点:
(1)2代合并的超级节点,最多1+2个元素,因此最多拥有 4 个子节点(4 阶B树)
(2)3 代合并的超级节点,最多1+2+4=7个元素,最多拥有 8 个子节点(8 阶B树)
(3)n 代合并的超级节点,最多1+2+4+8+……+2n-1个元素,最多拥有 2n 个子节点(2n 阶B树)

因此:m 阶 B树,最多需要二叉搜索树中log2m 代合并;
注意:多代合并并不一定把多代所有元素都合并
红黑树就是2代完全合并的4阶B树的等效树

二叉搜索树转3阶B树示例
树04_B树_第2张图片
注意:在合并的时候,要满足B树的性质;不是乱合并的
3阶B树性质:
(1)根节点的元素个数: x ∈ [1,2]
(2)非根节点的元素个数:x ∈ [1,2]
(3)当前节点的子节点的元素个数: y = x + 1

B树的搜索

树04_B树_第3张图片

先在节点内部从小到大开始搜索元素

  • 如果命中,搜索结束
  • 如果未命中,再去对应的子节点中搜索元素,重复步骤 1

B树的添加

新添加的元素必定是添加到叶子节点
演示:4阶B树的添加
树04_B树_第4张图片
插入 55:
树04_B树_第5张图片
插入 95:
树04_B树_第6张图片
再插入 98 呢?
此时最右下角的叶子节点的元素个数将超过限制,这种现象可以称之为:上溢(overflow)

添加 – 上溢的解决

上溢节点的元素个数必然等于m的时候,发生上溢;

假设上溢节点最中间元素的位置为 k

  • (1)将 k 位置的元素向上与父节点合并
  • (2)将 [0, k - 1] 和 [k + 1, m - 1] 位置的元素分裂成 2 个子节点
    这 2 个子节点的元素个数,必然都不会低于最低限制(┌ m/2 ┐ − 1)
    一次分裂完毕后,有可能导致父节点上溢,依然按照上述方法解决,最极端的情况,有可能一直分裂到根节点.当根节点也发生上溢,此时B树增高
    树04_B树_第7张图片
    插入 98:
    当m为偶数的时候,上溢95和98都可以
    树04_B树_第8张图片
    插入 52:
    树04_B树_第9张图片
    插入 54:
    树04_B树_第10张图片
    如果一直上溢到了根节点,会导致B树长高;B树长高的唯一情况:
    树04_B树_第11张图片

B树的删除

1)删除 – 叶子节点

假如需要删除的元素在叶子节点中,那么直接删除即可;
树04_B树_第12张图片

2)删除 – 非叶子节点

假如需要删除的元素在非叶子节点中
1.先找到前驱或后继元素,覆盖所需删除元素的值
2.再把前驱或后继元素删除
树04_B树_第13张图片
说明:
非叶子节点的前驱或后继元素,必定在叶子节点中;
真实删除的节点也都是叶子节点中的。

3)删除 – 下溢

下溢现象

当叶子节点被删掉一个元素后,元素个数可能会低于最低限制(┌ m/2 ┐ − 1),这种现象称为:下溢(underflow)

下溢的解决

前提:下溢节点在删除元素后的元素数量必然等于 ┌ m/2 ┐ − 2

情况1:下溢节点临近的兄弟节点,有至少 ┌ m/2 ┐ 个元素,此时可以向其借一个元素,借完一个后,还是>=┌ m/2 ┐-1,满足m阶树的性质。
树04_B树_第14张图片
具体做法:
1.将父节点的元素 b 插入到下溢节点的 0 位置(最小位置)
2.用兄弟节点的元素 a(最大的元素)替代父节点的元素 b
3.将a节点的子节点转移给b的子节点(不改变二叉搜索特性)

这种操作本质上就是:旋转,旋转后仍满足b>d>a
上图是对b进行右旋转:B变成左子节点的右子树

情况2:下溢节点临近的兄弟节点,只有 ┌ m/2 ┐ − 1 个元素
树04_B树_第15张图片

解决办法:
父节点中间元素和左右子节点合并
1.将父节点的元素 b 挪下来跟左右子节点进行合并
2.合并后的节点元素个数等于┌ m/2 ┐ + ┌ m/2 ┐ − 2,不超过 m − 1
这个操作可能会导致父节点下溢,依然按照上述方法解决,下溢现象可能会一直往上传播

5阶B树删除示例:
非根节点的元素个数 >= 3-1
树04_B树_第16张图片
20下溢导致30下溢;

当下溢传播到了根节点会让B树变矮
下溢传播到了根节点意味着根节点全部元素都和子节点元素进行合并

4阶B树

如果先学习 4 阶 B 树(2 - 3 - 4 树),将能更好地学习理解红黑树.

4阶B树的性质:
所有节点能存储的元素个数 x :1 ≤ x ≤ 3
所有非叶子节点的子节点个数 y :2 ≤ y ≤ 4
树04_B树_第17张图片

你可能感兴趣的:(数据结构,数据结构)