#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;
}
#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;
}