B-树模拟实现详解
什么是 B-树
B-树是一种平衡的 M 路(M>=2)查找树。它可以是空树,每个节点拥有多个子节点,这种结构有效减少了树的高度,从而显著提高查找效率。
核心特性
- 根节点至少有两个孩子;
- 每个非根节点至少有
ceil(M/2)-1个关键字,至多有M-1个关键字,且按升序排列; - 每个非根节点至少有
ceil(M/2)个孩子,至多有M个孩子; key[i]和key[i+1]之间的孩子节点的值介于这两个关键字之间;- B-树通过节点的分裂和合并操作来保持树的平衡,所有叶子节点都位于同一层。
插入机制分析
以 M=3 为例,每个节点存储两个数据时,可以将区间分割为三部分。为了方便处理分裂逻辑,我们通常假设每个节点最多有三个关键字、四个孩子,当插入第三个关键字后再进行分裂。
下面以插入序列【53, 139, 75, 49, 145, 36, 101】为例构建 B 树:

步骤解析:
- 插入 53:树为空,直接作为根节点。
- 插入 139:添加到根节点。
- 插入 75:此时节点内已有两个元素,继续添加。
- 引发分裂:节点满后触发分裂,中间元素上移。
- 插入 49 和 145:分别落入不同分支。
- 插入 36:进入左子树。
- 再次分裂:子节点满,向上冒泡。
- 插入 101:最终调整完成。

插入总结
- 若树为空,新节点即为根节点。
- 若树非空,需找到待插入元素在树中的位置(注意:插入位置一定在叶子节点中)。
- 检测元素是否已存在(假设 key 唯一),若存在则不插入。
- 按插入排序思想将元素放入节点。
- 检查节点是否满足性质(元素个数 < M)。若不满足,执行分裂操作。
- 分裂时申请新节点,将中间位置右侧元素及孩子搬移,并将中间元素及新节点插入父节点,递归处理直到不再分裂或到达根节点。
代码实现细节
基本结构设计
为了实现 B-树,我们需要定义节点结构和辅助类。这里使用 Java 语言演示。
首先是一个简单的键值对类 Pair,用于返回查找结果:
public class Pair<K,V> {
private K key;
V val;
{
.key = key;
.val = val;
}
K { key; }
{ .key = key; }
V { val; }
{ .val = val; }
}


