B树源代码.docVIP

  • 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)

1亿VIP精品文档

相关文档