B-
发表于:2007-05-26来源:作者:点击数:
标签:
12345678910 B-树//////////////////////////////////////////////////////////////////////////// File: b-tree.h// Date: 2005 / 07 / 10// Author: centaurus// Email: vim_user@126.com///////////////////////////////////////////////////////////////
12345678910
B-树
//////////////////////////////////////////////////////////////////////////
// File: b-tree.h
// Date: 2005 / 07 / 10
// Author: centaurus
// Email: vim_user@126.com
//////////////////////////////////////////////////////////////////////////
#ifndef __BSubtractTree_H__
#define __BSubtractTree_H__
#include
using namespace std;
template
class BSubtractTree
{
private:
//data: 0 1 2 ...
// | | | |
//child: 0 1 2 3 ...
typedef struct TNode // 树结点,如上结构
{
T *data; // 结点数据序列,假设增序排列
struct TNode **child; // 子结点指针数组
struct TNode *parent; // 父结点指针
int key_num; // 结点数据个数
}TNode;
typedef struct Location // 查找关键字结果
{
TNode *node; // 所在结点
int offset; // 所在结点数据偏移量
}Location;
private:
TNode *head; // 树头
int tnode_num;
const int LIMIT; // 阶,结点数据最多个数
T *array;
const int SIZE;
private:
// 得到一新结点
TNode *GetNode();
// 在指定结点p、结点数据偏移量*i处插入关键字
void Add(TNode *p, int *i, T key, TNode *new_node);
// 自结点p、分割点partition以右的数据,分割出一新结点
void Split(TNode *p, int partition, TNode **new_node);
// 修改head
void NewRoot(T key, TNode *new_node);
// 在结点数据序列中查找关键字
int SearchKey(TNode *p, T key);
// 查找树结点
bool SearchNode(T key, Location *position);
// 中序遍历显示树结点
void InOrder(TNode *n);
// 先序遍历
void PreOrder(TNode *n);
public:
BSubtractTree();
BSubtractTree(T *a, int s, int l);
// 在查找结果处插入关键字
void Insert(T key, Location *position);
void InOrderShow();
void PreOrderShow();
void Delete(T key, Location *position);
~BSubtractTree();
};
#endif
//////////////////////////////////////////////////////////////////////////
// File: b-tree.h
// Date: 2005 / 07 / 10
// Author: centaurus
// Email: vim_user@126.com
//////////////////////////////////////////////////////////////////////////
#ifndef __BSubtractTree_Fun_Def_H__
#define __BSubtractTree_Fun_Def_H__
#include "b-tree.h"
template
int BSubtractTree:: SearchKey(TNode *p, T key)
{
int i;
if(key > p->data[p->key_num - 1]) // 关键字小于序列最小值
return p->key_num;
else
if(key < p->data[0]) // 大于最大值
return 0;
else
if(key >= p->data[0] && key <= p->data[p->key_num - 1]) // 关键字在序列中
{
for(i = 0; i < p->key_num; i++)
{
if(key <= p->data[i]) // 返回等于或小于序列数据的下标
{
break;
}
}
}
return i;
}
template
bool BSubtractTree:: SearchNode(T key, Location *position)
{
TNode *p = head;
TNode *pre = NULL;
bool found = false;
int i = 0;
while(p && !found)
{
i = SearchKey(p, key);
if(i > 0 && p->data[i] == key)
found = true;
else
{
pre = p;
p = p->child[i];
}
}
if(found) // 找到返回true,offset指向该值下标
{
position->node = p;
position->offset = i;
return true;
}
else // 未找到,offset指向第一个大于key的下标
{
position->node = pre;
position->offset = i;
return false;
}
}
template
BSubtractTree:: TNode* BSubtractTree:: GetNode()
{
int i;
TNode *temp = new TNode;
temp->parent = NULL;
temp->key_num = 0;
temp->data = new T [LIMIT];
for(i = 0; i < LIMIT; i++)
{
temp->data[i] = 0;
}
temp->child = new TNode* [LIMIT + 1];
for(i = 0; i < LIMIT + 1; i++)
{
temp->child[i] = NULL;
}
tnode_num++;
return temp;
}
template
void BSubtractTree:: Add(TNode *p, int *i, T key, TNode *new_node)
{
int _i;
for(_i = p->key_num; _i > *i; _i--) // 将数据序列*i及其以后数值向后挪一位
{
p->data[_i] = p->data[_i - 1];
}
p->data[_i] = key; // 在*i位插入关键字
for(_i = p->key_num + 1; _i > *i + 1; _i--) // 挪动child指针数组
{
p->child[_i] = p->child[_i - 1];
}
p->child[_i] = new_node; // 插入子结点,子结点为NULL或分割结点
p->key_num++;
if(new_node)
new_node->parent = p;
}
template
void BSubtractTree:: Split(TNode *p, int partition, TNode **new_node)
{
*new_node = GetNode(); // 存放新结点地址
int _i;
int j = 0;
int m = p->key_num;
for(_i = partition + 1; _i < m; _i++)
{
(*new_node)->data[j++] = p->data[_i];
(*new_node)->key_num++;
p->data[_i] = 0;
p->key_num--;
}
j = 0;
for(_i = partition + 1; _i < m + 1; _i++)
{
(*new_node)->child[j] = p->child[_i];
if(p->child[_i])
(*new_node)->child[j]->parent = *new_node;
p->child[_i] = NULL;
j++;
}
}
template
void BSubtractTree:: NewRoot(T key, TNode *new_node)
{
TNode *temp = GetNode();
temp->data[0] = key;
temp->key_num = 1;
temp->child[0] = head;
temp->child[1] = new_node;
if(head)
head->parent = temp;
if(new_node)
new_node->parent = temp;
head = temp;
}
template
void BSubtractTree:: Insert(T key, Location *position)
{
TNode *p = position->node;
int i = position->offset;
T k = key;
int partition;
TNode *new_node = NULL;
bool condition = false;
while(p && !condition)
{
Add(p, &i, k, new_node);
if(p->key_num < LIMIT)
condition = true;
else
{
partition = LIMIT / 2;
Split(p, partition, &new_node);
k = p->data[partition];
p->data[partition] = 0;
p->key_num--;
p = p->parent;
if(p)
i = SearchKey(p, k);
}
}
if(!condition) // 为空树或将树头结点进行了分割
NewRoot(k, new_node);
}
template
BSubtractTree:: BSubtractTree() : SIZE(0), LIMIT(0)
{
head = NULL;
tnode_num = 0;
array = NULL;
}
template
BSubtractTree:: BSubtractTree(T *a, int s, int l) : SIZE(s), LIMIT(l)
{
head = NULL;
tnode_num = 0;
int i;
Location position;
array = new T [SIZE];
for(i = 0; i < SIZE; i++)
{
array[i] = a[i];
}
for(i = 0; i < SIZE; i++)
{
if(!SearchNode(array[i], &position)) // 查找关键字失败则插入关键字
{
Insert(array[i], &position);
}
}
}
template
void BSubtractTree:: Delete(T key, Location *position)
{
}
template
BSubtractTree:: ~BSubtractTree()
{
Location position;
for(int i = 0; i < SIZE; i++)
{
if(SearchNode(array[i], &position))
{
Delete(array[i], &position);
}
}
}
template
void BSubtractTree:: InOrder(TNode *n)
{
if(n)
{
int i;
for(i = 0; i < n->key_num + 1; i++)
{
InOrder(n->child[i]);
if(i < n->key_num)
cout << n->data[i] << endl;
}
}
}
template
void BSubtractTree:: PreOrder(TNode *n)
{
if(n)
{
int i;
cout << "NodeAddress:" << n << " ";
cout << "NodeParent:" << n->parent <key_num; i++)
{
cout << "DataKey " << i << " : " << n->data[i] << " | ";
}
cout << "\n";
for(i = 0; i < n->key_num + 1; i++)
{
cout << "Child[" << i <<"] : " << n->child[i] << " | ";
}
cout << "\n\n";
for(i = 0; i < n->key_num + 1; i++)
{
PreOrder(n->child[i]);
}
}
}
template
void BSubtractTree:: InOrderShow()
{
cout << "InOrder List : " << endl;
InOrder(head);
}
template
void BSubtractTree:: PreOrderShow()
{
cout << "PreOrder List : " << endl;
PreOrder(head);
}
#endif
//////////////////////////////////////////////////////////////////////////
// File: b-tree.h
// Date: 2005 / 07 / 10
// Author: centaurus
// Email: vim_user@126.com
//////////////////////////////////////////////////////////////////////////
#include
using namespace std;
#include "b-tree_fun_def.cpp"
void main()
{
int a[10] = ;
BSubtractTree test(a, 10, 3);
test.InOrderShow();
//test.PreOrderShow();
}
原文转自:http://www.ltesting.net
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-