(1)设计一个算法,求出给定二叉排序树中最小和最大的关键字,并上机实现。
(2)设计一个算法,求出指定节点在二叉排序树中的层次,并上机实现。
(3)顺序表的类型定义为:
typedef {int key; float info;} sqlist;
请给出对分法查找的递归算法,并上机实现。
(1)一棵二叉排序树的最左下节点即为关键字最小的节点。一棵二叉排序树的最右下节点即为关键字最大的节点。对应的算法如下:
KeyType MinKey(BSTNode *bt) /*求最小关键字*/
{
while(bt->lchild!=NULL)
bt=bt->lchild;
return(bt->key);
}
KeyType MaxKey(BSTNode *bt) /*求最大关键字*/
{
while(bt->rchild!=NULL)
bt=bt->rchild;
return(bt->key);
}
void MinMaxKey(BSTNode *bt,KeyType &min,KeyType &max)
/*求最小、最大关键字*/
{
min=MinKey(bt);
max=MaxKey(bt);
}
(2)采用循环语句边找边累计层次n。当找到关键字为k的节点时返回n;否则返回0。算法如下:
int Level(BSTNode *bt,KeyType k)
{
int n=1;
BSTNode *p=bt;
while(p!=NULL && p->key!=k)
{
if(k<p->key)
p=p->lchild; /*在左子树中查找*/
else
p=p->rchild; /*在右子树中查找*/
n++; /*层数增1*/
}
if(p!=NULL)
return n;
else
return(0); /*表示未找到*/
}
(3)对分法查找的递归算法描述如下:
int Bsearch(sqlist r[ ],int i,int j,int k)
{
int m;
if (i>j)return(-1);
else
{
m=(i+j)/2;
if(r[m].key==k)
return m;
if(r[m].key<k)
return(Bsearch(r,i,m-1,k));
else
return(Bsearch(r,m+1,j,k));
}
}