算法-搜索(5)m路搜索树
动态m路搜索树即系统运行时可以动态调整保持较高搜索效率的最多m路的搜索树。
以3路搜索树为例说明其关键码排序关系:
const int MaxValue=9999; template <class T> struct MtreeNode:public Mtree{ int n; //关键码个数 MtreeNode<T> *parent; T key[m+1]; //key[m]为监视哨兼单元,key[0]未使用 MtreeNode<T> *ptr[m+1]; //子树结点指针数组,ptr[m]在插入溢出时使用 int *recptr[m+1]; //每个索引项中指向数据区相应记录起始地址的指针 }; template <class T> struct Triple{ //搜索结果三元组定义 MtreeNode<T> *r; int i; //结点中关键码序号 int tag; //tag为0表示搜索成功,为1表示搜索失败 }; template <class T> class Mtree{ protected: MtreeNode<T> *root; const int m; //最大子树个数,等于树的度 public: Triple<T> Search(const T&x); }; template <class T> Triple<T> Mtree<T>::Search(const T& x){ Triple result; //记录搜索结果三元组 GetNode(root); //从磁盘上读取位于根root的结点 MtreeNode<T> *p=root,*q=NULL; //p是扫描指针,q用来记录p的父结点指针 int i=0; while(p!=NULL){ p->key[(p->n)+1]=MaxValue; while(p->key[i+1]<x) i++; //在结点内顺序搜索 if(p->key[i+1]==x){ result.r=p;result.i=i+1;result.tag=0; //返回结果 return result; } q=p;p=p->ptr[i]; //本结点无x,q记录当前结点,p下降到相应子树 GetNode(p); //从磁盘读取p结点 } result.r=q; result.i=i+1; result.tag=1; return result; //搜索失败,返回插入位置 }