m路搜索树是多路树,是二叉树的通用版本,其中每个节点包含多个元素。在顺序为m的m-way树中,每个节点最多包含m-1个元素和m个子元素。
高度为h的m-Way搜索树的目标要求为O(h)no。插入/删除/检索操作的访问次数。因此,它确保高度h接近log_m(n +1) 。
高度为h的m-Way搜索树中的元素数范围从最小值h到最大值h 。 。
n个元素的m-Way搜索树的范围从最小log_m(n + 1)到最大n
下图显示了一个5向搜索树的示例。观察每个节点最多有5个子节点,因此最多包含4个键。
m-Way树的节点结构如下:
struct node {
int count;
int value[MAX + 1];
struct node* child[MAX + 1];
};
- 这里, count表示特定节点具有的子代数
- 存储在数组值中的节点的值
- 子节点的地址存储在子数组中
- MAX宏表示特定节点可以包含的最大值数
在m-Way搜索树中搜索:
- 在m-Way搜索树中搜索关键字类似于二叉搜索树
- 要在五向搜索树中搜索77(如图所示),我们从根开始,并从77> 76> 44> 18开始,移至第四子树
- 在第四子树的根节点中,77 <80,因此我们移至该节点的第一子树。由于77在此子树的唯一节点中可用,因此我们声称已成功搜索77
// Searches value in the node
struct node* search(int val,
struct node* root,
int* pos)
{
// if root is Null then return
if (root == NULL)
return NULL;
else {
// if node is found
if (searchnode(val, root, pos))
return root;
// if not then search in child nodes
else
return search(val,
root->child[*pos],
pos);
}
}
// Searches the node
int searchnode(int val,
struct node* n,
int* pos)
{
// if val is less than node->value[1]
if (val < n->value[1]) {
*pos = 0;
return 0;
}
// if the val is greater
else {
*pos = n->count;
// check in the child array
// for correct position
while ((val < n->value[*pos])
&& *pos > 1)
(*pos)--;
if (val == n->value[*pos])
return 1;
else
return 0;
}
}
搜索():
- 函数search()接收三个参数
- 第一个参数是要搜索的值,第二个参数是要从中执行搜索的节点的地址,第三个参数是变量的地址,该变量的地址一旦找到就将用于存储该值的位置
- 最初,检查条件是否正在搜索的节点的地址为NULL
- 如果是,则仅返回一个NULL值
- 否则,将调用一个函数searchnode() ,该函数实际上将搜索给定值
- 如果搜索成功,则返回在其中找到该值的节点的地址
- 如果搜索不成功,则对当前节点的子代对search()函数进行递归调用
searchnode():
- 函数searchnode()接收三个参数
- 第一个参数是要搜索的值
- 第二个参数是要在其中执行搜索的节点的地址,第三个参数是一个指针pos ,它保存一个变量的地址,该变量的地址存储在一次找到的值的位置
- 如果搜索失败,则此函数返回值0;如果搜索成功,则返回1。
- 首先在此函数中检查要搜索的值是否小于节点的第一个值
- 如果是,则表明该值在当前节点中不存在。因此,由于搜索失败,因此在pos指向的变量中分配了值0,并返回了0。