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;
}
#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;
}
相关文章推荐
- 使用JAVA代码来模拟线性链表的相关操作(增加,删除,插入及查找等)
- [网络收集]DataList的相关操作实例的前台代码,如:分页、修改、删除、增加等
- datagrid行内按钮(更新/删除等)操作实现代码
- linux账号群组删除等相关操作
- iphone:ios中文件的相关操作:读,写,删除
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- Android代码工具集——json相关操作
- 算法导论第三版-第6章堆排序操作完整代码(建堆、插入、删除、排序等)
- python操作数据库相关的代码
- Repeater控件实现编辑、更新、删除等操作示例代码
- 单向链表的相关操作(创建,遍历,插入,删除,逆置)
- php批量删除操作代码分享
- 利用dbcp数据库连接池连接数据库,并利用dbtuils框架对数据库test中book表进行插入、删除、修改、查询的操作代码
- 静态顺序表的实现及相关操作源代码(插入,删除,排序,逆置,超详细)
- C++ stl队列Queue用法介绍:删除,插入等操作代码举例
- C++ stl队列Queue用法介绍:删除,插入等操作代码举例
- yii 数据库添加,修改,删除相关操作总结
- yii2 数据库的相关操作的代码示例
- java 两个通过java代码操作FTP的类,上传下载删除,获取文件
- c++实现循环单链表的相关操作(创建,插入,删除,保序插入,统计结点)