B-树基础
B-树是一种平衡的 M 路(M>=2)查找树。它允许每个节点拥有多个子节点,从而有效减少树的高度,提升查找效率。作为数据库和文件系统的核心索引结构,理解其内部机制至关重要。
核心特性
- 根节点:至少有两个孩子(除非它是叶子节点)。
- 非根节点:至少有
ceil(M/2) - 1个关键字,至多有M-1个关键字,且按升序排列。 - 子节点数:非根节点至少有
ceil(M/2)个孩子,至多有M个孩子。 - 区间约束:
key[i]和key[i+1]之间的孩子节点的值介于这两个关键字之间。 - 平衡性:通过节点的分裂和合并操作保持平衡,所有叶子节点位于同一层。
插入机制分析
以 M=3 为例,每个节点存储两个数据,将区间分割为三部分。为了便于处理分裂逻辑,我们通常约定:当节点满(达到 M 个关键字)时再触发分裂,想象成节点最多容纳 M 个关键字,M+1 个孩子。
插入流程
假设插入序列为【53, 139, 75, 49, 145, 36, 101】:
- 初始插入:直接放入根节点。
- 正常插入:找到对应位置插入,若未满则结束。
- 触发分裂:当节点关键字数量达到上限时,需进行分裂操作,将中间元素上移至父节点,左右部分形成新节点。

关键步骤总结
- 空树处理:若树为空,新建根节点并插入。
- 查找位置:定位到叶子节点,注意检查重复键值。
- 有序插入:在叶子节点内按顺序插入新键。
- 节点分裂:若节点满,申请新节点,将中间右侧元素及子指针迁移,中间元素上提至父节点。若父节点也满,递归分裂直至根节点。
代码实现思路
数据结构定义
我们需要一个节点类来维护关键字数组、子节点指针、父节点引用以及当前已用空间大小。这里使用 Pair 辅助类来返回查找结果(节点 + 下标),以便区分'找到元素'和'未找到但确定插入位置'两种情况。
public class Pair <K,V> {
private K key;
private V val;
public Pair(K key, V val) { this.key = key; this.val = val; }
public K getKey { key; }
{ .key = key; }
V { val; }
{ .val = val; }
}





