1-选择题练手

1.采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是

A.每次划分后,先处理较长的分区可以减少递归次数

B.递归次数与初始数据的排列次序无关

C.每次划分后,先处理较短的分区可以减少递归次数

D.递归次数与每次划分后得到的分区处理顺序无关

:D

递归次数,取决于递归树,而递归树取决于轴枢的选择。树越平衡,递归次数越少。

而对分区的长短处理顺序,影响的是递归时对栈的使用内存,而不是递归次数。

A.递归次数与初始数据的排列次序有关,若有序,次数为O(N),理论上最少的次数为O(logN)。

B.C.每次划分后,先处理较短的分区,只是减少了递归占用的内存空间,并不能减少递归次数。


2.一棵完全二叉树第6层有9个叶节点(根为第1层),则节点个数最多有

A.111

B.112

C.107

D.109

:D

第6层有9个叶子节点,则可推测该二叉树最多有7层,节点总数为:

2^0 + 2^1 + 2^2 + 2^3 +2^4 +2^5 + 2*(32-9) = 109


3.对于序列16,14,10,8,7,9,3,2,4,1,以下说法正确的是

A.小顶推

B.大顶堆

C.不是堆

D.二叉排序树

:B

最大堆中所有父节点都比其左子树、右子树大。最小堆中所有的父节点都比其左子树、右子树小。

二叉排序树需要满足:左孩子<根<右孩子。


4.已知关键字序列5,8,12,19,28,20,15,22是最小堆,插入关键字3,调整后得到的最小堆是

A.3,8,12,5,20,15,22,28,19

B.3,5,12,19,20,15,22,8,28

C.3,12,5,8,28,20,15,22,19

D.3,5,12,8,28,20,15,22,19

:D

 建堆,插入元素放在最后;将插入元素依次与父节点进行比较,若比父节点小,则与父节点替换进行堆调整,以此类推。


5.一棵二叉树的先序遍历为EFHIGJK,中序遍历为HFIEJKG,则后序遍历为

A.HIFJKGE

B.FHIJKGE

C.HIFGJKE

D.HIFKJGE

:D

:难点在右子树,多尝试。


6.对数组A[]={4,78,3,64,32,89,43,12}进行Hash存储时,选用H(K)=K%7作为Hash函数,则Hash地址为1的元素有几个

A.1

B.2

C.3

D.4

:C

H(k)=k%7;

H(78)=78%7=1

H(64)=64%7=1

H(43)=43%7=1

根据上述公式判断,这里只是问 Hash地址为1的元素,并没有涉及到实际存放的位置,而且冲突的处理方法也没有涉及,所以只要计算Hash后的值即可。


7.对于线性表(7,34,55,25,64,46,20,10)进行散列存储时,若使用H(K)=K%9作为散列函数,则散列地址为1的元素有几个

A.1

B.2

C.3

D.4

:D

55%9=1

64%9=1

46%9=1

10%9=1


8.已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7 计算散列地址,并散列存储在散列表A[0....6]中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为

A.1.5

B.1.7

C.2.0

D.2.3

:C

平均查找长度 = 总的查找次数 / 元素数

总的查找次数: 38%7=3 (第1次出现3,无冲突,放在位置3,查找次数为1)

25%7=4(第1次出现4,无冲突,放在位置4,查找次数为1)

74%7=4(第2次出现4,有冲突,放在位置5,查找次数为2)

63%7=0(第1次出现0,无冲突,放在位置0,查找次数为1)

52%7=3(第2次出现3,有冲突,发现冲突3,4,5,故只能放到6,查找次数为4)

48%7=6 (第1次出现6,有冲突,发现冲突6,0,故只能放到1,查找次数为3)

1+1+2+1+4+3=12

元素数=6

所以:平均查找长度=12/6=2


9.以30为基准,设一组初始记录关键字序列为 (30,15,40,28,50,10,70),则第一趟快速排序结果为

A 10,28,15,30,50,40,70

B 10,15,28,30,50,40,70

C 10,28,15,30,40,50,70

D 10,15,28,30,40,50,70

:B

初始化左指针为1,右指针为6

从右指针开始比较,右指针自减,到10的时候发现比30小,两者交换得到:10,15,40,28,50,30,70

从左指针开始比较,左指针自增,到40的时候发现比30大,两者交换得到:10,15,30,28,50,40,70

从右指针开始比较,右指针自减,到28的时候发现比30小,两者交换得到:10,15,28,30,50,40,70

此时完成第一趟排序,已经满足30的左边都比30小,右边都比30大


10.在双向循环链表中,在p指针所指的节点后插入一个指针q所指向的新节点,修改指针的操作是A.p->next=q;q->prior=p;p->next->prior=q;q->next=q;
B.p->next=q;p->next->prior=q;q->prior=p;q->next=p->next;
C.q->prior=p;q->next=p->next;p->next->prior=q;p->next=q;
D.q->next=p->next;q->prior=;p->next=q;p->next=q;
:C

  • 双向链表插入首先将新加入的结点的两个指针指向正确位置即q->prior=p;q->next=p->next;
  • 然后将原链表后面的那个结点前去指向新节点, p->next->prior=q;
  • 将原链表前面的结点指向新节点 p->next=q;

最重要的顺序是:在q与原链表后面那个结点建立双向连接之前不可以改变p->next否则原链表断掉无法找到后面那个结点.

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值