数据结构与算法(java版)第一季 - 10 B树

目录

初识红黑树

B树 (Balance Tree)

B树性质

B树VS二叉搜索树

​编辑​编辑

搜索

添加

上溢的解决方式

删除 - 非叶子节点

下溢的解决

4阶B树


初识红黑树

红黑树也是一种自平衡的二叉搜索树,以前也叫做平衡二叉B树(Symmetric Binary B-tree)
红黑树必须满足以下 5 条性质
1. 节点是 RED 或者 BLACK
2. 根节点是 BLACK
3. 叶子节点 (外部节点,空节点)都是 BLACK
4. RED 节点的子节点都是 BLACK
RED 节点的 parent 都是 BLACK
从根节点到 叶子节点 的所有路径上不能有 2 个连续的 RED 节点
5. 从任一节点到叶子节点的所有路径都包含相同数目的 BLACK 节点

 红黑树是个什么东西????????????????????????????????????????????????????????????

B树 (Balance Tree)

B树 是一种平衡的 多路 搜索树,多用于文件系统、数据库的实现(比如说MySQL)
仔细观察B树,有什么眼前一亮的特点?
1.1 个节点可以存储超过 2 个元素、可以拥有超过 2 个子节点
2.拥有二叉搜索树的一些性质
3.平衡,每个节点的所有子树高度一致
4.比较矮

B树性质

假设一个节点存储的元素个数为 x,m代表相应的一个阶数.
根节点: 1 x m − 1
非根节点: ┌ m/2 ┐ − 1 x m − 1  左边的的那个符号是代表着向上取整ceiling.向下取整是整好相反的.
如果有子节点,子节点个数 y = x + 1
根节点: 2 y m  -------- 由根节点进行一个推断
非根节点: ┌ m/2 ┐ y m
比如 m = 3, 2 y 3 ,因此可以称为(2, 3)树、2-3树
比如 m = 4, 2 y 4 ,因此可以称为(2, 4)树、2-3-4树
比如 m = 5, 3 y 5 ,因此可以称为(3, 5)树
比如 m = 6, 3 y 6 ,因此可以称为(3, 6)树
比如 m = 7, 4 y 7 ,因此可以称为(4, 7)树

如果要是m=2,B树是根节点个数m=2,非根节点个数是1<=y<=2.

B树VS二叉搜索树

B树 和 二叉搜索树,在逻辑上是等价的
多代节点合并,可以获得一个超级节点
2代合并的超级节点,最多拥有 4 个子节点(至少是 4阶B树)父子的关系,最多是四个叉叉
3代合并的超级节点,最多拥有 8 个子节点(至少是 8阶B树)
n代合并的超级节点,最多拥有 2 n 个子节点( 至少是 2 n 阶B树)
m阶B树,最多需要 log 2 m 代合并

搜索

◼ 跟二叉搜索树的搜索类似

1. 先在节点内部从小到大开始搜索元素
2. 如果命中,搜索结束
3. 如果未命中,再去对应的子节点中搜索元素,重复步骤 1

添加

 ◼ 新添加的元素必定是添加到叶子节点

插入55

 ◼ 插入95

再插入 98 呢?(假设这是一棵 4阶B树)
最右下角的叶子节点的元素个数将超过限制
这种现象可以称之为: 上溢(overflow)

上溢的解决方式

上溢节点的元素个数必然等于 m

◼ 假设上溢节点最中间元素的位置为 k
将 k 位置的元素向上与父节点合并
将 [0, k-1] 和 [k + 1, m - 1] 位置的元素分裂成 2 个子节点

这 2 个子节点的元素个数,必然都不会低于最低限制( ┌ m/2 ┐ − 1
一次分裂完毕后,有可能导致父节点上溢,依然按照上述方法解决
最极端的情况,有可能一直分裂到根节点

 添加操作如下所示:原始的树是如下所示:

插入98:

插入52: 

 插入54:

删除 - 非叶子节点

假如需要删除的元素在非叶子节点中
1. 先找到前驱或后继元素,覆盖所需删除元素的值
2. 再把前驱或后继元素删除
删除60的操作:
非叶子节点 的前驱或后继元素,必定在 叶子节点
所以这里的删除前驱或后继元素 ,就是最开始提到的情况:删除的元素在叶子节点中
真正的删除元素都是发生在叶子节点中------这个非常重要的,在红黑树的学习过程之中还是会用到的.

下溢的解决

如下现象之中可能会出现相应的一个下溢的现象:

◼ 删除 22 ?(假设这是一棵 5阶B树)

叶子节点被删掉一个元素后,元素个数可能会低于最低限制( ≥ ┌ m/2 ┐ − 1 )

这种现象称为:下溢

解决方式:
◼ 下溢节点的元素数量必然等于 ┌ m/2 ┐ − 2
◼ 方式一:如果下溢节点临近的兄弟节点,有至少 ┌ m/2 ┐ 个元素,可以向其借一个元素
将父节点的元素 b 插入到下溢节点的 0 位置(最小位置)
用兄弟节点的元素 a(最大的元素)替代父节点的元素 b
这种操作其实就是:旋转
◼ 方式二: 如果下溢节点临近的兄弟节点,只有 ┌ m/2 ┐ − 1 个元素
将父节点的元素 b 挪下来跟左右子节点进行 合并
合并后的节点元素个数等于 ┌ m/2 ┐ + ┌ m/2 ┐ − 2 ,不超过 m − 1
这个操作可能会导致父节点下溢,依然按照上述方法解决,下溢现象可能会一直往上传播

4阶B树

4阶B树 的性质
所有节点能存储的元素个数 x 1 x 3
所有非叶子节点的子节点个数 y 2 y 4
添加
从 1 添加到 22
删除
从 1 删除到 22

如上所示,分析删除1的过程.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值