- 画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。
例如:长度为10的折半查找判定树的具体生成过程:
都遵循这个规律,左孩子结点<根结点<右孩子结点
(1)在长度为10的有序表中进行折半查找,不论查找哪个记录,都必须和中间记录进行比较,而中间记录为
(1+10)/2 =5 (注意要取整) 即判定树的根结点为5,如图7-2(a)所示。
(2)考虑判定树的左子树,即将查找区域调整到左半区,此时的查找区间为[1,4],那么中间值为(1+4)/2 =2 (注意要取整) ,所以做孩子根结点为2,如图7-2(b)所示。
(3)考虑判定树的右子树,即将查找区域调整到右半区,此时的查找区间为[6,10],那么中间值为(6+10)/2 =8 (注意要取整) ,所以做孩子根结点为8,如图7-2(c)所示。
(4)重复以上步骤,依次去确定左右孩子。
长度为10的有序表的成功平均查找长度为:
ASL=(1*1+2*2+3*4+4*3)/10=29/10;
2.已知一组关键字{49,38,65,97,76,13,27,44,82,35,50},按输入序列的顺序生成二叉排序树,只需画出最终结果。
3.已知散列表的地址区间为0~11,散列函数为H(k)=k % 11,采用线性探测法处理冲突,将关键字序列20,30,70,15,8,12,18,63,19依次存储到散列表中,试构造出该散列表,并求出在等概率情况下的平均查找长度。
4.设散列函数为H(k)=k % 11,采用链地址法处理冲突,将上题中关键字序列依次存储到散列表中,并求出在等概率情况下的平均查找长度。
二 编程题
1.设计一个算法,从大到小输出该二叉排序树中所有关键字不小于X的数据元素。
【提示】
若对二叉排序树中序遍历,则遍历结果的序列是递增有序的。若采取先遍历右子树,然后遍历根结点,最后遍历左子树的策略, 则遍历结果的序列是递减有序的(直到小于X为止)。
方法一:
void OutPut(BSTNode *bt,keyType k)
{
if(bt==null)
return ;
if(bt->rchild!=null)
OutPut(bt->rchild,k);
if(bt-<data>=k)
printf("%d",bt->data);
if(bt->lchild!=null)
OutPut(bt->lchild,k);
}
方法二:
void InOrder(BSTree *root,int k){
if(!root)
return ;
InOrder(root->lchild,k);
if(root->data>=k){
visit(root);
}
InOrder(root->rchild,k);
}
2.设计一个算法,求出给定二叉排序树中值为最大的结点。
【提示】二叉排序树上最大的结点肯定是右子树的最右下结点。因此,首先从根结点开始查找,然后顺着右子树查找,直到结点没有右子树为止。
keyType Maxkey(BSTNode *bt)
{
while(bt->rchild!=null)
bt=bt->rchild;
return bt->data;
}