暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
B 树全代码实现与超超详细思路解读.pdf
82
18页
2次
2024-03-21
免费下载
B 树全代码实现与超超详细思路解读
—— 目录 ——
B 树全代码实现与思路解读
结构体与宏定义
查询操作
打印操作
插入操作
删除操作
B 树全代码实现与思路解读
接下来就正式进入主题啦(嘛,可能前面废话有点多)
结构体与宏定义
需要提前定义以下常量,方便后续的使用
/* B 树阶数 */
#define M 4
/* B 树关键最大最小值以及中间 */
#define MAX_KEY (M-1)
#define MIN_KEY ((M-1)/2)
#define MID_KEY ((M+1)/2)
注意点 1
对于三个 KEY 值的解释
MAX_KEY 应该很好理解,M B 树就是该树最多有 M 棵子树, M-1 个关键字自然
会留出 M 个子树的位置啦
MIN_KEY 的话,按照定义应该 M/2 向上取整为子树数量,但是整型除法默认是向下取整
呀,所以我们需要调整成 (M+1)/2,这样相当于被 2 的向上取整了,然后对应的关键字
数量自然就是 (M+1)/2 - 1 (M-1)/2
MID_KEY 分裂需要移到上层的录的置,注意个值和面的大最小值
显的区别哦,前边的表示数量,而该值表示的是“位置”。右应为 KEY 的第一个位置不存
值,位置应该从 1 开始数所以本来中间位置应该是 M/2 在第一个位置不使用之后,
自然就变成了 (M+1)/2
然后准备以下 3 个结构体
/* 记录类型 */
typedef struct Rcd {
int key; // 记录的键
int data; // 记录的值
} Rcd, *Record;
/* B 树结构体 */
typedef struct BTNode {
int keyNum; // 结点中关键字个数,即结点的大小
KeyType key[M + 1]; // 关键字数组,0 号单元未用
Record rcd[M + 1]; // 记录指针数组0 号单元未
struct BTNode* parent; // 指向双亲结点
struct BTNode* child[M + 1];// 子树指针数组,0 号有使用
} BTNode, *BTree;
/* 结果类型 */
typedef struct Result {
int i; // 在结点中的关键字位序
int tag; // 是否找到了
BTree data; // 找到的数据
} Result;
然后是所有的接口
/* 通用辅助接口 */
Record getRecord(int key, int data); // 获得一个记录
Result getResult(int i, int tag, BTree data); // 获得一个结果
/* B 树接口 */
Status InitBTree(BTree& tree, Record data); // 初始化 B
BTree MakeBTree(const int treeData[][2], int num); // 构建 B
void TraverseBTree(BTree tree); // 打印 B
Result SearchBTree(BTree tree, KeyType key); // B 树执行查找操作
Status InsertBTree(BTree& tree, Record data); // B 树执行插入操作
Status DeleteBTree(BTree tree, KeyType key); // B 树执行删除操作
Status UpdateBTree(BTree tree, KeyType key, Record data); // B key
记录更换成新的记录
/* B 树辅助接口 */
int Search(BTree node, KeyType key); // 寻找 key node 所在结点中的位置
void InsertBTNode(BTree& node, int i, Record rcd, BTree newNode); // rcd
结点 node 的第 i 个位置,同时将新子节 newNode 作为后继孩子
Status SplitBTNode(BTree& node, BTree& newNode); // node 从中两部
前半部分留在原位,后半部分进入 newNode 并指向原结点的双
Status newRoot(BTree& root, Record rcd, BTree child1, BTree child2); // 生成一个新根
int CountKeyNum(BTree tree); // 计算出整棵树上记录条数的总和
void Successor(BTree& node, int& i); // 找到前驱结点,并进行关键字的替换
Status InsertRecord(BTree& node, int i, Record rcd); // rcd i
Status RemoveRecord(BTree& node, int i); // 将指定结点中 i 个记录移除
void RestoreBTree(BTree& node, int pi); // 针对某个结点调整一颗 B
of 18
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜