B树是一种自平衡多路搜索树,满足最小度数t≥2、所有叶子同层等性质,适合磁盘I/O优化;其核心操作包括满则分裂的插入、多路比较的搜索及递归遍历。
用 C++ 实现一个简单的 B 树,核心在于理解 B 树的定义:它是一种自平衡的多路搜索树,每个节点可含多个键和子节点,满足最小度数 t(t ≥ 2),所有叶子在同一层,适合磁盘 I/O 优化——这正是数据库索引(如 MySQL 的 InnoDB)底层常用结构的原因。
我们以最小度数 t = 2(即每个非根节点至少有 1 个键、最多 3 个键,最多 4 个子节点)为例,定义节点结构:
keys[]、子节点指针数组 children[]、键数量 n、是否为叶子 isLeaf
insert、search、splitChild、insertNonFull 等方法插入必须维持 B 树性质,核心是「满则分裂」:
n == 2*t - 1 == 3),先调用 splitChild 将其分裂为两个 t−1 键的节点,并将中位键上推到父节点搜索是标准的多路 BST 查找:
keys[i] == key,返回成功;否则沿 children[i] 继续递归(注意:i 从 0 开始,叶子无子节点需提前判断)以下为完整可编译的简化版(仅含 insert / search / print):
#include#include using namespace std; const int t = 2; // minimum degree
struct Node { vector
keys; vector children; bool isLeaf; Node() : isLeaf(true) {} }; class BTre
e { public: Node* root; BTree() : root(nullptr) {}
void insert(int k) { if (!root) { root = new Node(); root->keys.push_back(k); return; } if (root->keys.size() == 2*t-1) { Node* s = new Node(); s->children.push_back(root); splitChild(s, 0); root = s; } insertNonFull(root, k); } void insertNonFull(Node* x, int k) { int i = x->keys.size() - 1; if (x->isLeaf) { x->keys.push_back(0); // placeholder while (i >= 0 && x->keys[i] > k) { x->keys[i+1] = x->keys[i]; --i; } x->keys[i+1] = k; } else { while (i >= 0 && x->keys[i] > k) --i; ++i; if (x->children[i]->keys.size() == 2*t-1) { splitChild(x, i); if (k > x->keys[i]) ++i; } insertNonFull(x->children[i], k); } } void splitChild(Node* x, int i) { Node* y = x->children[i]; Node* z = new Node(); z->isLeaf = y->isLeaf; z->keys.assign(y->keys.begin()+t, y->keys.end()); if (!y->isLeaf) z->children.assign(y->children.begin()+t, y->children.end()); y->keys.resize(t-1); if (!y->isLeaf) y->children.resize(t); x->children.insert(x->children.begin()+i+1, z); x->keys.insert(x->keys.begin()+i, y->keys[t-1]); y->keys.pop_back(); } bool search(Node* x, int k) { if (!x) return false; int i = 0; while (i < x->keys.size() && k > x->keys[i]) ++i; if (i < x->keys.size() && x->keys[i] == k) return true; if (x->isLeaf) return false; return search(x->children[i], k); } void print(Node* x, int level = 0) { if (!x) return; cout << "Level " << level << ": "; for (int k : x->keys) cout << k << " "; cout << "\n"; if (!x->isLeaf) for (Node* c : x->children) print(c, level+1); }};
// 示例用法 int main() { BTree t; for (int v : {10,20,5,6,12,30,7,17}) t.insert(v); t.print(t.root); cout
基本上就这些。实际数据库索引会扩展为支持范围查询、并发控制、持久化、键值对存储(而不仅是 int)、以及更复杂的合并/重平衡策略。但这个版本已体现 B 树的核心思想:分裂保平衡、多路降高度、局部有序支持高效检索。
# mysql
# node
# ai
# c++
# ios
# stream
# 键值对
# print
# for
# 封装
# 递归
# 插入排序
# int
# 指针
# 数据结构
# 并发
# 数据库
# 子树
# 多路
# 遍历
# 最多
# 这是
# 是一种
# 第一个
# 多个
# 将其
相关文章:
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
如何高效利用200m空间完成建站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
建站之星伪静态规则如何正确配置?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何选择网络建站服务器?高效建站必看指南
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
已有域名建站全流程解析:网站搭建步骤与建站工具选择
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
简历在线制作网站免费版,如何创建个人简历?
网页设计与网站制作内容,怎样注册网站?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何在建站之星网店版论坛获取技术支持?
深圳网站制作案例,网页的相关名词有哪些?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
如何通过西部数码建站助手快速创建专业网站?
自助网站制作软件,个人如何自助建网站?
建站主机与虚拟主机有何区别?如何选择最优方案?
高防服务器如何保障网站安全无虞?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
建站VPS配置与SEO优化指南:关键词排名提升策略
如何快速搭建高效简练网站?
,如何利用word制作宣传手册?
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何配置支付宝与微信支付功能?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何在万网自助建站平台快速创建网站?
如何快速生成专业多端适配建站电话?
电商网站制作价格怎么算,网上拍卖流程以及规则?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何彻底删除建站之星生成的Banner?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
建站之星如何优化SEO以实现高效排名?
购物网站制作公司有哪些,哪个购物网站比较好?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
定制建站如何定义?其核心优势是什么?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何在云服务器上快速搭建个人网站?
h5在线制作网站电脑版下载,h5网页制作软件?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
再谈Python中的字符串与字符编码(推荐)
宝塔新建站点为何无法访问?如何排查?
如何制作网站标识牌,动态网站如何制作(教程)?
如何快速搭建安全的FTP站点?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
*请认真填写需求信息,我们会在24小时内与您取得联系。