本章节一共有20道选择题是数据结构的易错题,解析很详细,大家正常观看
我认为重要的会标红
1
正确答案是A
搜索两个数字和为sum,至少要遍历一遍数组,一个从左开始向右找,一个从右向左找
所以是O(n)
2.
这道题选D,因为是时间复杂度,时间复杂度就是执行次数,因为是i<=n,每次2倍递增,所以是logN次
3.
答案:C
解析:大O是一个渐进表示法,不会去表示精确的次数,cpu的运算速度很快,估计精确的没有意义。
4.
![]()
答案:B
解析:
此处开辟的是一个二维数组,数组有n行,每行分别有1,2,3,...n列,所以是n(n + 1)/2个元素空间,空间复杂度为n^2
5.
![]()
答案是C,因为空间复杂度的定义是额外开辟的空间,二维数组是固定的空间,并不是额外的空间,所以是常数次
6.
答案:B
解析:
有效长度一般是rear-front, 但是循环队列中rear有可能小于front,减完之后可能是负数,所以需要+N,此时结果刚好是队列中有效元素个数,但如果rear大于front,减完之后就是有效元素个数了,再加N后有效长度会超过N,故需要%N。
7.
8.
建议画一下图
答案:B
解析:
首先这棵二叉树的高度一定在3~4层之间:
三层:
A(B(C,D),()), A((),B(C,D)), A(B(C,()),D), A(B((),C),D),
A(B,C(D,())), A(B,C((),D))
四层:
如果为四层,就是单边树,每一层只有一个节点,除过根节点,其他节点都有两种选择,在上层节点的左边还是右边,所以2*2*2共8种
总共为14种。
9.
答案:B
根据完全二叉树的定义,前n-1层是满二叉树,最后一层也是连续排列的子树(中间不会中断),节点没有左孩子,就一定没有右孩子,要不然就没有完全二叉树了,所以必然是叶节点
解析:
完全二叉树中如果一个节点没有左孩子,则一定没有右孩子,必定为一个叶子节点,最后一层一定为叶子节点,但是倒数第二层也可能存在叶子节点。
10
答案:C
解析:
该题需要用到二叉树性质:在任意二叉树中,度为0的节点都比度为2的节点多1个,即 n0 = n2 + 1
n0 + n1 + n2 = 1001
这里假设度为1的是一个,或者0个带入式子发现度为1的只有0个,所以叶子结点就是n0是501
另外,在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点,如果节点总个数为偶数,只有一个度为1的节点
因此:n0 + n1 + n2 = 1001 节点总数为奇数,没有度为1的节点
n0 + 0 + n2 = 2*n0-1 = 1001 n0 = 501
11
答案是B
树度为4,最小深度就是每个结点的孩子都是4的时候深度最小,4的0次方+4的一次方+4的2次方+ +4的n次方,当n为6的时候结点个数刚好大于1000,所以最小深度就是6
12
答案:A
解析:
树的特点是不相交,所以不可能有多个路径同时到达一个点。
13
答案:B
快排有序性能最差,是n方,有了三数取中可以达到n*logn
插入排序是部分有序性能最好,希尔排序是插入排序的优化所以希尔排序也会被顺序影响
解析:
快排: 初始顺序影响较大,有序是,性能最差
插入: 接近有序,性能最好
希尔:希尔是对插入排序的优化,这种优化是在无序的序列中才有明显的效果,如果序列接近有序,反而是插入最优。
堆排,归并,选择对初始顺序不敏感
14
答案选D很明显是快速排序的挖坑法,自己画一下图就行
15
答案:C
解析:
快排的非递归是在模拟递归的过程,所以时间复杂度并没有本质的变化,但是没有递归,可以减少栈空间的开销。栈和队列都可以实现。
16
答案:A
题意就是求空间复杂度,记住递归栈帧是求其高度
解析:
归并排序空间复杂度:n
快排: logn
希尔,堆排: 1
17
只有快排是有两种情况,有序是n方,三数取中能约等于n*logn,其他排序均为1种情况
答案:A
解析:
快排: n^2 ~ nlogn
归并: nlogn
选择: n^2
堆排: nlogn
18
答案B
其实这道题就是将时间复杂度的精确值大致算出来然后带入】
每次比较完会缩短数组长度,可以类比成1+2+。。。+n也就是
带入是B选项
19
![]()
就记住降序建小堆,升序建大堆就行
而且这道题为了建小堆可以用向下调整算法,从倒数第一个父节点开始调整,直到第一个结点结束,不太理解的话可以看看我之前写过的二叉树与堆,有详细的堆调整算法
二叉树和堆-CSDN博客
https://blog.csdn.net/eixjdj/article/details/145232674?spm=1001.2014.3001.5501
因为是建小堆所以选A
20
![]()
答案:C
解析:
这里说的是快排的第二趟,即在第一趟快排的结果的基础上进行的,如果已经经过了一趟排序,则会通过第一趟选择的基准值划分两个子区间,每个子区间也会以区间内选择的基准值划分成两部分。
A: 第一趟的基准值可以为2, 第二趟的基准值可以为3
B: 第一趟的基准值可以为2, 第二趟的基准值可以为9
C: 第一趟的基准值只能是9,但是第二趟的基准值就找不出来,没有符合要求的值作为基准值,所以不可能是一个中间结果。
D: 第一趟的基准值可以为9, 第二趟的基准值可以为5