• 分块查找

分块查找(block search)是一种性能介于顺序查找和折半查找之间的查找方法。它要求按如下的索引方式来存储线性表:将表 R[0..n-1]均分为b块,前b-1块中的元素个数为s=「n/b] 最后一块(即第b块)的元素数小于等于s;每一块中的关键字不一定是有序的,但前一块中的最大关键字必须小于后一块中的最小关键字,即要求整个表是“分块有序”(block order)的。

数据结构(知识点碎片四十四)_二叉排序树

数据结构(知识点碎片四十四)_二叉排序树_02

while(low <= high)
{
int mid = (low + high)/2; 
if(arr[mid] == key)
return mid;
else if(arr[mid] > key)
high = mid - 1; 
else
low = mid + 1;
}

 (二)、树表的查找

若要对动态查找表进行高效率的查找,可采用几种特殊的二叉树/树作为表的组织形式,在这里将它们统称为树表(tree table)。

  • 二叉排序树

二叉排序树(又称二叉搜索树)或者是空树,或者是满足以下下性质的二叉树:

  1. 若它的左子树不空,则左子树上所有关键字的值均小于根关键字的值;
  2. 若它的右子树不空,则右子树上所有关关键字的值均大于根关键字的值;
  3. 左右子树又各是一棵二叉排序树。
BTNode* BSTSearch(BTNode* p, int key)  //不容易考到
{
while(p != NULL)
{
if (key == p->key)
return p;
else if (key < p->key)
p = p->lChild; 
else
p = p->rChild;
}
return NULL;
}


BTNode* BSTSearch(BTNode* p, int key)//递归实行更容易考到
{
if(p == NULL)
return NULL; 
else{
if(p->key == key)
return p;
else if(key < p->key)
return BSTSearch(p->lChild, key); 
else
return BSTSearch(p->rChild, key);
}
}

数据结构(知识点碎片四十四)_分块查找_03

int BSTInsert(BTNode *&p, int key)
{
if(p == NULL)
{
p = (BTNode*)malloc(sizeof(BTNode)); 
p->lChild = p->rChild=NULL; 
p->key = key; 
return 1;
}
else
{
if(key == p->key)
return 0;    //已经存在了,显示插入失败
else if(key < p->key)
return BSTInsert(p->lChild, key); 
else
return BSTInsert(p->rChild, key);
}
}