B-树原理与 Java 模拟实现详解
B-树是一种平衡的 M 路(M>=2)查找树,其核心设计目标是减少磁盘 I/O 次数。相比二叉搜索树,B-树通过增加每个节点的子节点数量来降低树的高度,从而在海量数据存储场景中表现优异。
定义与特性
- 根节点至少有两个孩子;
- 每个非根节点至少有 M/2(上取整) 个关键字,至多有 M-1 个关键字,且升序排列;
- 每个非根节点至少有 M/2(上取整) 个孩子,至多有 M 个孩子;
- key[i] 和 key[i+1] 之间的孩子节点的值介于两者之间;
- 所有叶子节点位于同一层。
插入分析
以 M=3 为例,每个节点最多存储两个数据。为了简化分裂逻辑,我们允许节点暂时容纳三个关键字,插入第三个后再触发分裂。
下面以序列【53, 139, 75, 49, 145, 36, 101】构建 B 树的过程演示:




插入总结:
- 若树为空,直接创建根节点。
- 若非空,定位到叶子节点位置。
- 检查元素是否已存在,避免重复插入。
- 按排序插入后,若节点满(达到 M),则执行分裂操作。
- 分裂可能向上传播,直至根节点或不再需要分裂。
模拟实现
基本结构
我们需要一个节点类 BTRNode,包含关键字数组、子节点指针、父节点指针以及当前有效关键字数量。同时需要一个辅助类 Pair 来返回查找结果。
public class Pair<K, V> {
private K key;
private V val;
public Pair(K key, V val) {
.key = key;
.val = val;
}
K { key; }
{ .key = key; }
V { val; }
{ .val = val; }
}
{
{
[] keys;
BTRNode[] subs;
BTRNode parent;
usedSize;
{
.keys = [M];
.subs = [M + ];
}
}
;
BTRNode root;
}


