啊啊啊啊啊啊这一章真的是搞了好久啊 今天状态贼差 脑子疼痛 特别困和疲累
唉,该写的作业还得写该考的考试还得考 今天我想早点休息啊
(1)对 22 个记录的有序表作折半查找,当查找失败时,至少需要
比较( )次关键字。
A.3 B.4 C.5 D.6
答案:B
解释:22 个记录的有序表,其折半查找的判定树深度
为 5,且该判定树不是满二叉树,即查找失败时至多比
较 5 次,至少比较 4 次
`(2)试写出折半查 [算法描述]
int BinSrch(rectype r[ ],int k,low,high)//在长为 n 的有序表中查找关键字 k,若查找成功,返回 k 所在位置,查找失败返回 0。
{
if(low≤high) //low 和 high 分别是有序表的下界和上界
{mid=(low+high)/2;
if(r[mid].key==k)return (mid);
else if(r[mid].key>k)return (BinSrch(r,k,mid+1,high));
else return (BinSrch(r,k,low,mid-1));
}
else return (0);//查找失败。
}//算法结束 `
`(3)试写一个判别给定二叉树是否为二叉排序树的算法
#define true 1
#define false 0
typedef struct node
{datatype data; struct node *lchild,*rchild;} *BTree;
void JudgeBST(BTree T,int flag)
// 判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag 得出结论。
{ if(T!=null && flag)
{ Judgebst(T->lchild,flag);// 中序遍历左子树
if(pre==null)pre=T;// 中序遍历的第一个结点不必判断
else if(pre->data<T->data)pre=T;//前驱指针指向当前结点
else{flag=flase;} //不是完全二叉树
Judgebst (T->rchild,flag);// 中序遍历右子树
}//JudgeBST 算法结束 `
(4)已知二叉树 T 的结点形式为(lling,data,count,rlink),在
树中查找值为 X 的结点,若找到,则记数(count)加 1,否则,作
为一个新结点插入树中,插入后仍为二叉排序树,写出其非递归算
法。
`void SearchBST(BiTree &T,int target){
BiTree s,q,f; //以数据值 target,新建结点 s
s=new BiTNode;
s->data.x=target;
s->data.count=0;
s->lchild=s->rchild=NULL;
if(!T){
T=s;
return ;
} //如果该树为空则跳出该函数
f=NULL;
q=T;
while (q){
if (q->data.x==target){
q->data.count++;
return ;
} //如果找到该值则计数加一
f=q;
if (q->data.x>target) //如果查找值比目标值大,则为
该树左孩子
q=q->lchild;
else //否则为右孩子
q=q->rchild;
} //将新结点插入树中
if(f->data.x>target)
f->lchild=s;
else
f->rchild=s;
} `
(5)假设一棵平衡二叉树的每个结点都表明了平衡因子 b,试设计
一个算法,求平衡二叉树的高度
`int Height(BSTree t)// 求平衡二叉树 t 的高度
{level=0;p=t;
while(p)
{level++; // 树的高度增 1
if(p->bf<0)p=p->rchild;//bf=-1 沿右分枝向下
//bf 是平衡因子,是二叉树 t 结点的一个域
else p=p->lchild; //bf>=0 沿左分枝向下
}//while
return (level);//平衡二叉树的高度
} //算法结束 `
(6)分别写出在散列表中插入和删除关键字为 K 的一个记录的算
法,设散列函数为 H,解决冲突的方法为链地址法
`bool insert(){
int data;
cin>>data;
int ant=hash(data);
LinkList p=HT[ant]; //初始化散列表
while (p->next){
if(p->next->data==data)
return false;
p=p->next;
} //找到插入位置
LinkList s;
s=new LNode;
s->data=data;
s->next=p->next;
p->next=s; //插入该结点
return true;
}
bool deletes(){
int data;
cin>>data;
int ant=hash(data);
LinkList p=HT[ant]; //初始化散列表
while (p->next){
if(p->next->data==data){
LinkList s=p->next;
p->next=s->next;
delete s; //删除该结点
return true;
} //找到删除位置
p=p->next; //遍历下一个结点
}
return false;}`