B-树的C++实现

发布一个B-树的代码

 

代码下载:http://bluedog.download.csdn.net

 

B-树网上的代码很象不是很多,关于它的原理我觉得没有必要要谈了,书上网上太多了。这里我花了几天的时间写了一个,大家觉得有用的话就用吧,已经进行大量的测试,应该没有什么太大问题了,它由两个文件定义:BinaryMinusTree.h BinaryMinusTree.inc,你只要包含BinaryMinusTree.h就好了。

#include "BinaryMinusTree.h"

这两个文件定义了几个类,不过你唯一需要了解的只是CBinaryMinusTree 这个类,它的定义如下:

template<typename TK,typename TV,size_t THD=10>

class BinaryMinusTreeKey

TK Key值的类型,

TV Val 值的类型,

THD 是节点度的一半,意思是如果你一个节点的度是21即有21KEY值,那么THD就应为10

 

它有几个方法:

bool Add(TK key,TV val); //增加一个Key和值

bool Remove(TK key);      //删除一个Key

void Print();              //打印树

void Clear();              //删除所有数据

 

还有几个公共成员:

LPBMTN Root;  //根节点

size_t KeyCount; //关键字数量

size_t Level; //树层数

size_t NodeCount; //树节点数

没有提供其它功能,有其它需要的朋友自已完善它吧。呵呵。

附记:其实B-树的原理很简单,书上提供的算法描述也很清楚,不过真正要写好它还是有点难度,很多要注意的地方,一不小心树就挂了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
b-是一种常见的数据结构,可以用于磁盘或其他存储介质上的数据存储,其插入操作非常重要。下面是b-的插入c代码实现: 首先,我们需要定义一些b-的基本结构,包括节点的结构体和b-的结构体。 ```C #define M 3 // M为b-的阶数 typedef struct bnode { int key[M+1]; // 关键字数组,长度为M+1 int count; // 关键字个数 struct bnode *child[M+1]; // 子节点指针数组,长度为M+1 bool leaf; // 是否为叶子节点 }BNode; typedef struct btree { BNode *root; }BTree; ``` 其中,每个节点可以存储M个关键字,在插入时可能需要分裂,所以设定长度为M+1。子节点指针数组长度也为M+1。叶子节点标志位为true时表示为叶子节点,否则为内部节点。 接下来是插入操作的代码: ```C void btree_insert(BTree *T, int key) { BNode *r = T->root; if (r->count == M) // 根节点已满,则需要创建新的根节点 { BNode *s = (BNode*) malloc(sizeof(BNode)); s->leaf = false; s->count = 0; s->child[0] = r; T->root = s; btree_split(s, 0, r); btree_insert_nonfull(s, key); } else { btree_insert_nonfull(r, key); } } void btree_insert_nonfull(BNode *x, int key) { int i = x->count; if (x->leaf) { while (i > 0 && key < x->key[i-1]) { x->key[i] = x->key[i-1]; i--; } x->key[i] = key; x->count++; } else { while (i > 0 && key < x->key[i-1]) { i--; } BNode *y = x->child[i]; if (y->count == M) // 子节点已满,则需要分裂 { btree_split(x, i, y); if (key > x->key[i]) { i++; } } btree_insert_nonfull(x->child[i], key); } } void btree_split(BNode *x, int i, BNode *y) { BNode *z = (BNode*) malloc(sizeof(BNode)); z->leaf = y->leaf; z->count = M/2; for (int j = 0; j < M/2; ++j) { z->key[j] = y->key[j+M/2]; } if (!y->leaf) { for (int j = 0; j < M/2+1; ++j) { z->child[j] = y->child[j+M/2]; } } y->count = M/2; for (int j = x->count; j >= i+1; --j) { x->child[j+1] = x->child[j]; } x->child[i+1] = z; for (int j = x->count-1; j >= i; --j) { x->key[j+1] = x->key[j]; } x->key[i] = y->key[M/2]; x->count++; } ``` b-的插入操作可以分为两种情况:直接在叶子节点上插入和需要在中间节点上插入。如果根节点已满,则需要创建新的根节点。如果插入的节点已满,则需要将该节点分裂。分裂时,将该节点的后M/2个关键字和子节点移动到新的节点中,将中间关键字插入到父节点中。插入操作在插入到叶子节点和非叶子节点时,递归调用即可。 以上是我对b-的插入c代码实现的介绍。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值