数据结构学习总结--查找算法设计题

啊啊啊啊啊啊这一章真的是搞了好久啊 今天状态贼差 脑子疼痛 特别困和疲累
唉,该写的作业还得写该考的考试还得考 今天我想早点休息啊


(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;}`

posted @ 2021-10-23 21:07  傲晨宇  阅读(439)  评论(0)    收藏  举报