首页/数据结构/06-search/B树和B+树 🔗 在 Obsidian 中打开
数据结构 · 06-search

B树和B+树

难度 ★★★★重要度 ★★ 考查频率 低题型 选择 B树B+树多路查找树
速查
B树是一种多路平衡查找树,广泛用于磁盘索引;B+树是 B树的变体,关键字与数据只在叶子,叶子用链表相连,是数据库索引的标准结构。

速查

项目
主题B树和B+树
核心概念B树是一种多路平衡查找树,广泛用于磁盘索引(数据库、文件系统)
稳定性稳定
难度⭐⭐⭐⭐

核心概念

B树是一种多路平衡查找树,广泛用于磁盘索引(数据库、文件系统)。每个节点可以有多个关键字和多个子树。

B树的定义(m 阶 B树)

性质要求
子树数每个节点最多 m 棵子树
关键字数每个节点最多 m-1 个关键字
非根节点最少 $\lceil m/2 \rceil$ 棵子树,$\lceil m/2 \rceil - 1$ 个关键字
根节点最少 2 棵子树(若非叶),1 个关键字
有序性节点内关键字递增排列,子树间的关键字介于相邻关键字之间
叶节点所有叶节点在同一层(通过失败节点表示)

B树示例(3 阶 B树)

        [30]
       /    \
   [10,20]  [40,50]
   / | \    / | \
 [5] [15] [25] [35] [45] [55]

B树的基本操作

查找

1. 在当前节点的关键字中顺序/折半查找
2. 若找到,返回
3. 若未找到,沿着对应的子树指针向下
4. 到达叶节点的失败指针,查找失败

插入

1. 先查找插入位置(一定是叶节点层)
2. 插入关键字
3. 若节点关键字数 > m-1,则分裂:
   - 取中间关键字上移到父节点
   - 左右两部分作为两个子节点
4. 若父节点也溢出,继续分裂(可能传播到根)

删除

1. 若删除的是叶节点关键字,直接删除
2. 若删除的是内部节点关键字,用前驱/后继替换后再删
3. 若删除后关键字数 < ⌈m/2⌉-1:
   - 兄弟够借 → 借一个(旋转)
   - 兄弟不够借 → 合并
4. 合并可能导致父节点也下溢,继续处理

B+树 vs B树

对比项B树B+树
关键字与子树n 个关键字对应 n+1 棵子树n 个关键字对应 n 棵子树
叶节点不存储数据(或存储所有数据)所有数据都在叶节点
叶节点链接叶节点用链表连接
查找路径任意节点都可能命中必须到叶节点才命中
适用场景文件系统数据库索引(MySQL InnoDB)

B+树的优势

  1. 范围查询高效:叶节点链表连接,遍历链表即可
  2. 查询稳定:每次都要到叶节点,路径长度一致
  3. 磁盘友好:非叶节点只存索引,可以容纳更多关键字

常见考法

考点说明
B树性质给定 m 阶 B树,判断节点关键字数的范围
插入分裂给定关键字序列,画出插入过程
删除合并给定 B树,删除关键字后的结构调整
B+树特点B树 vs B+树的区别
最小高度n 个关键字的 m 阶 B树的最小/最大高度

易错点

注意
  • B树的叶节点是失败节点(NULL 指针),不存储数据
  • 分裂时中间关键字上移到父节点,不是复制
  • 删除时合并是两个节点合并成一个,父节点关键字下移
  • B+树的非叶节点只是索引,不存储实际数据

核心结论

  • m 阶 B树的高度 h 满足:$\log_m(n+1) \leq h \leq \log_{\lceil m/2 \rceil} \frac{n+1}{2} + 1$
  • B树适合单点查找,B+树适合范围查询
  • B+树是数据库索引的标准数据结构
  • 插入分裂和删除合并是考试重点,必须会手算

记忆卡片

m 阶 B 树的关键字数限制?
非根节点最少 $\lceil m/2 \rceil-1$ 个,最多 m-1 个;根节点最少 1 个。
B 树和 B+ 树的核心区别?
B 树所有节点都存数据;B+ 树只有叶子存数据,叶子用链表相连便于范围查询。
B+ 树为什么适合数据库索引?
叶子节点有序链表支持范围查询,非叶节点只存索引更矮胖,减少磁盘 IO。
B 树的高度范围?
$\log_m(n+1) \leq h \leq \log_{\lceil m/2 \rceil}((n+1)/2) + 1$。
B 树插入时什么情况要分裂?
结点关键字数超过 m-1 时分裂,中间关键字上提,左右各一半。
B+ 树插入分裂与 B 树有何不同?
B+树把中间关键字复制到父结点,B树把中间关键字上移

交互动画 · 数据存在哪里

左:B树(数据散布在所有结点) 右:B+树(数据只在叶子 + 叶子链表) [30] [10,20] [40,50] [5] [15] [25] [35] [45] [55] [30] [10,20] [40,50] [5] [15] [25] [35] [45] [55] 点击左侧按钮看 B树(所有结点都存数据);点击右侧看 B+树(只有叶子存数据,叶子之间用链表相连)
点击上方按钮,对比两种树的数据存储位置
B树中所有结点都可能是命中位置;B+树只有叶子结点命中

相关知识点

hash-table block-search

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。