- 8
- 0
- 约1.59万字
- 约 19页
- 2016-08-23 发布于河南
- 举报
B树源代码
//状态宏定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#include iostream.h
#include Define.h
#define M 3
typedef class BNode //B-树节点结构体
{
public:
int Ext; //节点中包含有效关键字的数目,初始化的时候为0,取值1或2
int Elem[M-1]; //关键字数组,2个关键字
BNode *Ptr[M]; //下一级指针,3个指针
BNode *Parent; //指向双亲的指针
int ParentPosition; //指向该节点的指针在双亲节点下级指针数组中的位置
BNode(); //构造函数
}BNode,*BTree;
BNode::BNode()
{
Ext=0; //初始化元素个数为0
int i=0;
for(i=0;iM;i++) //初始化所有指向下级的指针为空
Ptr[i]=NULL;
Parent=NULL; //初始化指向双亲指针为空
ParentPosition=-1; //初始化指向该节点的指针在双亲节点下级指针数组中的位置为-1
}
class ElemInfo //需要加入的节点的信息结构体
{
public:
int Elem; //需要加入的关键字
BNode *EL; //该关键字对应的左边的指向下级的指针
BNode *ER; //该关键字对应的右边的指向下级的指针
ElemInfo(int x=0){Elem=x;EL=ER=NULL;};//构造函数以x初始化关键字,左右指向下级的指针初始化为空
};
#include Queue.h//包含队列头文件
BNode *FindPosition(int Elem,BTree T) //该函数返回关键字Elem在B-树中应该插入的位置,前提,Elem不在树中
{
if(!T) return NULL;
else
{
int i=0;
while(iT-ExtT-Elem[i]Elem)
i++;
BNode *p=FindPosition(Elem,T-Ptr[i]);
if(p==NULL) return T;
else return p;
}
}
BNode *InsertElem(ElemInfo EI,BNode * p) //该函数完成将节点信息结构体EI插入到p指向的节点当中,用递归完成了分裂和上升
{
if(!p||p-Ext==0)//插入到空的p中或者p不存在,主要用于处理树的分裂时需要申请新节点和删除时节点的移位
{
if(!p) p=new BNode;
p-Elem[0]=EI.Elem;
if(EI.ER!=NULLEI.EL!=NULL)//插入的同时调整了下级的Parent指针和ParentPosition
{
p-Ptr[0]=EI.EL;
p-Ptr[0]-ParentPosition=0;
p-Ptr[0]-Parent=p;
p-Ptr[1]=EI.ER;
p-Ptr[1]-ParentPosition=1;
p-Ptr[1]-Parent=p;
}
p-Ext++;
return p;
}
else if(p-ExtM-1)//p中有一个元素
{
if(EI.Elemp-Elem[0])//要插入的关键字大于存在的关键字,插入的同时调整了下级的Parent指针和ParentPosition
{
if(EI.ER)
{
p-Ptr[2]=EI.ER;
p-Ptr[2]-ParentPosition=2;
p-Ptr[2]-Parent=p;
p-Ptr[1]=EI.EL;
p-Ptr[1]-ParentPosition=1;
p-Ptr[1]-Parent=p;
}
p-Elem[1]=EI.Elem;
p-Ext++;
return p;
}
else//要插入的关键字小于存在的关键字,插入的同时调整了下级的Parent指针
原创力文档

文档评论(0)