B-树的常用操作。没有输入输出无法运行。
#include <iostream>
#define m 3//最多拥有三个节点,两个关键字。即三阶B-树
typedef struct Record{
int data;
}Record;
typedef struct BTNode{
int keyNum;//关键字数量。子树数量大一
struct BTNode *parent;
int key[m+1];
struct BTNode *ptr[m+1];// 0用的。子树数量比关键字数量大1
Record *recptr[m+1];//同key,找到了关键字找对应的record
};
typedef struct Result{
BTNode *pt;//指向关键字所在节点
int i;//指示key或record的对应序号
int tag;//1查找成功 0查找失败
}Result;
int search(BTNode *T,int key){
int t = 0;
if(!T){
return 0;
}else {
for(int i = 1;i <=5;i++){
if(T->key[i] <= key) {
t = i;
}
}
}
return t;
}
Result SearchBTree (BTNode *T,int k){
BTNode *p = T;
BTNode *q = NULL;;
int i = 0;
bool find = false;
while (p && !find){
i = search(T,k);
if(i>0 && p->key[i] == k){
find = true;
}else{
q = p;
p = p->ptr[i];
}
}
if(find){
Result re ;
re.pt = p;
re.i = i;
re.tag = 1;
return re;
}else{
Result re ;
re.pt = p;
re.i = i;
re.tag = 0;
return re;//失败时应插入key[]的第i号后面
}
}
//在节点中指定位置插入关键字。并补位ap
void Insert(BTNode *q,int i,int x,BTNode *ap){
i++;
for(int j = m;j>i;j--){
q->key[j-1] = q->key[j];
q->ptr[j-1] = q->ptr[j];
}
q->key[i] = x;
q->ptr[i] = ap;
q->parent = q;
}
//只适用m=3
void split(BTNode *q,int s,BTNode *&ap){
q->keyNum = 1;
ap->keyNum = 1;
ap->key[1] = q->key[3];
ap->ptr[0] = q->ptr[2];
ap->ptr[1] = q->ptr[3];
}
void NewRoot(BTNode *&T,BTNode *q,int x,BTNode *ap){
T = new BTNode;
T->key[1] = x;
T->keyNum = 1;
T->parent = NULL;
T->ptr[0] = q;
T->ptr[1] = ap;
q->parent = T;
ap->parent = T;
}
//在指定节点插入关键字。如果节点过大则分割,向父节点插入节点。
bool InsertBTree (BTNode *&T,int key,BTNode *q,int i){
int x = key;//插入关键字的值
BTNode *ap = NULL;
bool finished = false;
while(q && !finished){
Insert(q,i,x,ap);//将ap放在i的右边
if(q->keyNum < m) finished = true;
else{
int s = 2;//取m的中值
split(q,s,ap);//将q按照s的位置,拆分成两个。并创建节点ap,只有一个关键字。两边连接s左右。
x = q->key[s];//更新x
q = q->parent;//更新
if(q) i = search(q,x);//修正i
}
}
if(!finished){//T是空树说明需要重新生成根节点
NewRoot(T,q,x,ap);
}
return true;
}
int main(){
return 0;
}