-B树完整接口实现
B树的定义
B树是一种平衡的多路查找树。
一颗m阶B树,或为空树,或为满足下列特性的m叉树。
(1)树中每个结点最多含有m棵子树;
(2)若根结点不是叶子结点,则至少有两颗子树;
(3)除根之外的所有非终端结点至少有[m/2];
(4)每个非终端结点中包含信息:(n,A0,K1,A1,K2,A2,…,Kn,An)。其中
①Ki(1≤i≤n)为关键字,且关键字按升序排序。
②指针Ai(0≤i≤n)指向子树的根结点。
③关键字的个数n必须满足:[m/2]-1≤n≤m-1
(5)所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部节点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)
编程环境与配置
IDE:Dev-C++ 5.11
编程语言:C
程序结构图
B树的抽象数据类型定义
|
|
头文件
定义了需要用到的数据类型,结构体类型,以及所有函数接口;
|
|
B树具体接口实现
|
|
三.功能测试
插入功能测试/遍历功能测试
依次插入1-15进行测试输出,结果如下:
由输出的B树可知,插入功能正常并且遍历功能正常
3.2删除功能测试
在之前插入1-15后进行删除关键字的功能测试,选取9和1依次进行删除测试,结果如下:
根据B树的定义和该B树的输出,删除功能正常
3.3释放功能测试
在之前的基础上进行递归释放B树功能测试,结果如下:
遍历输出的结果为B数为空树,说明释放功能正常
3.4其他功能测试
其他接口在以上功能中已经有所体现,均正常,不再一一调用测试。
四.思考与小结
错误总结
(1)在部分需要判空的地方没有判空
(2)递归实现的时候多次爆栈
(3)插入分裂的SplitBTNode函数一开始写的时候分裂成两个
(4)删除操作中的Combine函数的指针忘记调整
4.2部分优化
4.2.1输出优化
在一开始输出的时候选用的是括号输出法(测试功能选用的值略有不同),在直观上比较难的去分辨哪些是双亲结点的左右结点,因此在输出函数上进行了优化
通过队列遍历,在每一次遍历的过程中能够,模拟层次遍历,在B树的结构上更加美观,而且更容易看清楚B树的结构
4.2.2测试界面优化
在保持原本接口不变的情况下,写了Test2函数,自行创建和进行各种B树的操作.
整个程序源代码
头文件
|
|
BTree代码
|
|
卡了下代码量
521lines
Merry christmas!