2026-10-19 11:32:24
B树和B+树都是为存储设备或磁盘设计的平衡查找树,用于高效存储和检索大量数据,但二者在原理和特性上存在明显区别。以下从原理、结构、操作和适用场景等方面详细阐述:
B树的原理节点孩子数限制:对于M阶B树,每个节点最多有M个孩子。
非根非叶子节点孩子数下限:除根节点和叶子节点外,其他节点最少含有?M/2?个孩子。
根节点孩子数下限:若根节点不是叶子节点,则最少有两个孩子。
叶子节点特性:所有叶子节点在同一层,且不包含关键字信息。
时间复杂度:含有N个节点的B树高度为O(log?N),查找效率较高。
键值存在:若B树中已存在需要插入的键值,用新键值替换旧值。
键值不存在:在叶子节点插入。若叶子节点关键码个数小于M - 1,直接插入;若等于M - 1,则节点分裂,以中间关键码为界分成两个新节点,并将中间关键码插入父节点。重复此过程,最坏情况下B树高度增加一层。

节点结构:分为叶子节点和非终端节点(索引节点)。非终端节点仅存储关键字作为索引,不存储实际数据;叶子节点存储关键字和对应数据。
叶子节点链接:所有叶子节点通过指针链接,形成有序链表,便于范围查询。
时间复杂度:与B树相同,含有N个节点的B+树高度为O(log?N)。
空树情况:若为空树,直接插入。
叶子节点插入:根据关键字找到叶子节点插入。若插入后叶子节点关键字数不大于M - 1,插入结束;否则分裂为左右两个叶子节点,左节点包含前?M/2?个记录,右节点包含剩余记录,并将第?M/2? + 1个记录的关键字进位到父节点。
索引节点插入:若当前索引节点关键字个数小于等于M - 1,插入结束;否则分裂为两个索引节点,左节点包含前?(M - 1)/2?个数据,右节点包含剩余数据,并将第?M/2?个关键字进位到父节点。
非终端节点存储内容:B树的非终端节点既存储关键字又存储数据;B+树的非终端节点仅存储关键字作为索引,数据存储在叶子节点。
叶子节点链接:B树的叶子节点无链接;B+树的叶子节点通过指针链接,形成有序链表。
单关键字查询:B树和B+树在最坏情况下都需要从根节点遍历到叶子节点,时间复杂度均为O(log?N)。但B+树的非终端节点不存储数据,相同阶数下能容纳更多关键字,树高度更低,查询效率略高。
范围查询:B树需多次中序遍历,效率较低;B+树可通过叶子节点的链表直接遍历,效率更高。
节点大小:B+树的非终端节点不存储数据,相对B树更小,可减少磁盘I/O次数。
查询稳定性:B+树所有关键字查询都走从根节点到叶子节点的路径,查询长度相同,效率稳定;B树的查询路径长度可能不同,效率不稳定。
B树:适用于需要同时进行插入、删除和查询操作的场景,如文件系统。
B+树:更适合数据库索引和文件索引,因其范围查询效率高、磁盘I/O代价低且查询稳定。
总结:B树和B+树通过平衡结构提高查找效率,但B+树在范围查询、磁盘I/O和查询稳定性方面更具优势,更适合数据库和文件系统等需要高效检索大量数据的场景。