算法-搜索(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;  //搜索失败,返回插入位置
}
原文地址:https://www.cnblogs.com/yangyuliufeng/p/9237632.html