B树相关操作纯代码(除删除操作)

本文详细介绍了B树的数据结构及其关键操作实现,包括搜索、分裂、非空时插入和建树过程,通过实例代码深入浅出地阐述了B树在数据存储与检索中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <cstdlib>


using namespace std;


typedef struct B_tree
{
bool leaf;//是否为叶子
int key_size;//关键字数量
char key[30];//预定关键字数量为30
B_tree *c[30];
}*BT;


int degree;//这颗B树的度数


//搜索函数
pair<BT, int> B_tree_search(BT x, char k)
{
int i = 1;
while(i <= x->key_size && k > x->key[i]) //从小到大
{  i++; }


if(i <= x->key_size && k == x->key[i])//找到了该点
{
pair<BT, int> result(x, i);
return result;
}


if(x->leaf)//未找到结点,并且到了叶子结点
{
cout<<"k不在树中!"<<endl;
exit(1);
}
else B_tree_search(x->c[i], k);//继续向下查找
}


//分裂操作
void B_tree_split_child(BT &x, int pos, BT y)
{
//y = x.c[i] x非满,y已满
int i;
BT z = new B_tree;
z->leaf = y->leaf;//分裂y,所以两者的leaf相同
z->key_size = degree - 1;

for(i = 1; i <= degree - 1; i++)
z->key[i] = y->key[degree + i];


if(!y->leaf)//不是树叶时,子女域才不空
{
for(i = 1; i <= degree; i++)//和上面形成对比,因为子女域不会发生变化
z->c[i] = y->c[degree+i];
}
    y->key_size = degree - 1;


for(i = x->key_size + 1; i >= pos + 1; i--)
x->c[i+1] = x->c[i];//子女指针域比关键字的数目多1


x->c[pos + 1] = z;//z中的成员比x[pos]大

for(i = x->key_size; i >= pos; i--)
x->key[i+1] = x->key[i];

x->key[pos] = y->key[degree];
x->key_size++;
}


//非空时的插入
void B_tree_insert_nonfull(BT &x, int k)
{
int i = x->key_size;
if(x->leaf)
{
while(i >= 1 && k <= x->key[i])//是反向查找之后插入的,因为没法一直往前插入
{
x->key[i+1] = x->key[i];
i--;
}
x->key[i+1] = k;
x->key_size++;
}
else 
{
while(i >= 1 && k < x->key[i])
i--;
i++;//该处k<=key[i],所以k应该插入到x->c[i]中
if(x->c[i]->key_size == 2 * degree - 1)
{
B_tree_split_child(x, i, x->c[i]);
if(k > x->key[i])//在i处分割x孩子结点,之后有结点上升,从而改变了i值,所以这里需要判断一下
i++;
B_tree_insert_nonfull(x->c[i], k);
}
}
}


//从顶点开始插入操作
void B_tree_insert(BT &T, char k)
{
BT r = T;
if(r->key_size == 2 * degree - 1)
{
BT s = new B_tree;
T = s;
s->leaf = 0;
s->key_size = 0;
s->c[1] = r;
B_tree_split_child(s, 1, r);
B_tree_insert_nonfull(s, k);
}
else B_tree_insert_nonfull(r, k);
}


//建树
void Creat_B_tree(BT &T)
{
T = new B_tree();
T->leaf = 1;
T->key_size = 0;
}


int main()
{
int num;
cout<<"please enter the num:"<<endl;
while(cin>>num)
{
   cin>>degree;
getchar();//吃了换行符
BT T;
Creat_B_tree(T);//创建树,并初始化
       
int i, j;
for(i = 1; i <= num; i++)
{
char k;
cout<<"please enter the character to insert:"<<endl;
            cin>>k;
B_tree_insert(T, k);
}
//随意搜索一个结点
char key;
cout<<"please enter the node for searching:"<<endl;
cin>>key;
pair<BT, int> result = B_tree_search(T, key);
cout<<"result_1:"<<result.first->key_size<<endl;
cout<<"result_2:"<<result.second<<endl;
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值