您的位置:首页 > 编程语言

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

2012-09-18 21:50 441 查看
#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:"&l
4000
t;<result.first->key_size<<endl;
cout<<"result_2:"<<result.second<<endl;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息