数据结构(C语言版 第2版严蔚敏)课后习题答案(选择题)
高冷罗少L 2024-10-25 08:05:01 阅读 74
目录
第一章 绪论
第二章 线性表
第三章 栈和队列
第四章 串、数组和广义表
第五章 树和二叉树
第六章 图
第七章 查找
第八章 排序
第一章 绪论
5. 选择题
(1)在数据结构中,从逻辑上可以把数据结构分成( )。
A. 动态结构和静态结构 B. 紧凑结构和非紧凑结构
C. 线性结构和非线性结构 D. 内部结构和外部结构
【解答】C
(2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的( )。
A. 存储结构 B. 存储实现
C. 逻辑结构 D. 运算实现
【解答】C
(3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( )。
A. 数据具有同一特点
B. 不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致
C. 每个数据元素都一样
D. 数据元素所包含的数据项的个数要相等
【解答】B
(4)以下说法正确的是( )。
A. 数据元素是数据的最小单位
B. 数据项是数据的基本单位
C. 数据结构是带有结构的各数据项的集合
D. 一些表面上很不相同的数据可以有相同的逻辑结构
【解答】D
数据元素使数据的基本单位。
数据项是组成数据元素的最小单位。
数据结构是带有结构的数据元素的集合。
(5)算法的时间复杂度取决于( )。
A. 问题的规模
B. 待处理数据的初态
C. 计算机的配置
D. A 和 B
【解答】D
(6)以下数据结构中,( )是非线性数据结构。
A. 树 B. 字符串 C. 队列 D. 栈
【解答】A
6. 试分析下列各算法的时间复杂度。
(1)
x = 90; y = 100;
while(y > 0)
if(x > 100)
{x = x - 10; y--;}
else x++;
【解答】O(1)
该算法的执行时间不随问题规模 n 的增长而增长。
(2)
for(i = 0; i < n; i++)
for(j = 0; j < m; j++)
a[i][j] = 0;
【解答】O(nm)
(3)
s = 0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
s += B[i][j];
sum = s;
【解答】
(4)
i = 1;
while(i <= n)
i = i * 3;
【解答】
设循环体内基本语句的频度为f(n),所以
,所以
,故时间复杂度为
。
i = i * 3,所以 i 的取值都有:1、3、9、27......,相当于
。
(5)
x = 0;
for(i = 1; i < n; i++)
for(j = 1; j <= n - i; j++)
x++;
【解答】
当 i = 1 的时候,内层运行了 (n - 1) 次,
当 i = 2 的时候,内层运行了 (n - 2) 次,
当 i = 3 的时候,内层运行了 (n - 3) 次,
.......
当 i = n - 1(i != n)的时候,内层运行了(n - (n - 1)) 次
所以加起来就是 (n - 1) + (n - 2) + (n - 3) +.....+ 1 = (n - 1 + 1)(n - 1)/2 =
故时间复杂度为
.
(6)
x = n; //n > 1
y = 0;
while(x >= (y + 1) * (y + 1))
y ++;
【解答】
假设语句“y++”的执行次数为 f(n),所以
,又x = n,所以
,得出
,故时间复杂度为
.
第二章 线性表
1. 选择题
(1)顺序表中第一个元素的存储地址是100,每 个元素的长度为2,则第5个元素的地址是( )。
A. 110 B. 108 C. 100 D. 120
【解答】 B
顺序表中的数据连续存储,LOC(
) = LOC(
) + (i - 1) * l
所以第 5 个元素的地址为: 100 + (5 -1) * 2= 108 。
(2)在n个节点的顺序表中,算法的时间复杂度是 O(1) 的操作是( )。
A. 访问第 i 个节点(
)和求第 i 个节点的直接前驱(
)
B. 在第 i 个节点后插入一个新节点(
)
C. 删除第 i 个节点(
)
D. 将 n 个节点从小到大排序
【解答】 A
顺序表是一种随机存取结构,访问第 i 个节点和求第 i 个节点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是 O(1) 。在顺序表中插入和删除一个节点的时间复杂度都是
,排序的时间复杂度为
或
。。
(3)向一个有 127 个元素的顺序表中插入一个新元素并保持原来顺序不变, 平均要移动的元素个数为( )。
A. 8 B. 63.5 C. 63 D. 7
【解答】B
平均要移动约表中一半的元素 。
(4)链接存储的存储结构所占存储空间( )。
A. 分两部分,一部分存放节点值,另一部分存放表示节点间关系的指针
B. 只有一部分,存放节点值
C. 只有一部分,存储表示节点间关系的指针
D. 分两部分,一部分存放节点值,另一部分存放节点所占单元数
【解答】A
(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( )。
A. 必须是连续的 B. 部分地址必须是连续的
C. 一定是不连续的 D. 连续或不连续都可以
【解答】D
(6)线性表L在( )情况下适用于使用链式结构实现。
A. 需经常修改L中的节点值 B. 需不断对L进行删除插入
C. L中含有大量的节点 D. L中结点结构复杂
【解答】B
链表的插入或删除操作无须移动数据,只需要直接修改指针。
(7)单链表的存储密度( )。
A. 大于 1 B. 等于 1 C. 小于 1 D. 不能确定
【解答】C
链表的存储密度小于1,顺序表的存储密度等于1。
(8)将两个各有 n 个元素的有序表归并成一个有序表,其最少的比较次数是( )。
A. n B. 2n-1 C. 2n D. n-1
【解答】A
假设这两个有序表对应的数组为 A[0, 1,...., n-1],B[0,1....., n-1],且假设A中数据都比B中的小,那么比较的顺序就为A中的元素从第一个开始依次与B中的第一个元素比较,即A[0] < B[0], A[1] < B[0], A[2] < B[0], ......., A[n-1] < B[0],所以比较的次数应该是n次。
比如 表A(1, 2, 3) 与 表B(4, 5, 6) 合并,则1, 2, 3依次与4比较,比较3次然后合并。
(9)在一个长度为 n 的顺序表中,在第 i 个元素(
)之前插入一个新元素时
须向后移动( )个元素。
A. n - i B. n - i + 1 C. n - i - 1 D. i
【解答】B
(10)线性表
,下列说法正确的是( )。
A. 每个元素都有一个直接前驱和一个直接后继
B. 线性表中至少有一个元素
C. 表中诸元素的排列必须是由小到大或由大到小
D. 除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继
【解答】D
A、第一个数据元素没有直接前驱,最后一个数据元素没有直接后继
B、线性表可以为空
C、线性表没有要求顺序
(11)创建一个包括 n 个节点的有序单链表的时间复杂度是( )。
A. O(1) B. O(n) C. O(
) D. O(
)
【解答】C
可以理解成将n个元素依次插入到空链表中,每一个元素插入需要遍历之前已经有序的链表,找到合适的位置,复杂度是O(n)。一共有n个元素,所以就是O(
)。
单链表创建的时间复杂度是 O(n) ,而要建立一个有序的单链表,则每生成一个新节点时需要和已有的节点进行比较,确定合适的插入位置,这里也是O(n),所以时间复杂度是O(
) 。
(12)以下说法错误的是( )。
A. 求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低
B. 顺序存储的线性表可以随机存取
C. 由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活
D. 线性表的链式存储结构优于顺序存储结构
【解答】D
链式存储结构和顺序存储结构都有自己的优缺点。
(13)在单链表中,要将 s 所指节点插入到 p 所指节点之后,其语句应为( ) 。
A. s->next = p+1; p->next = s;
B. (*p).next = s; (*s).next = (*p).next;
C. s->next = p->next; p->next = s->next;
D. s->next = p->next; p->next = s;
【解答】D
(14)在双向链表存储结构中,删除 p 所指的节点时须修改指针( )。
A. p->next->prior = p->prior; p->prior->next = p->next;
B. p->next = p->next->next; p->next->prior = p;
C. p->prior->next = p; p->prior = p->prior->prior;
D. p->prior = p->next->next; p->next = p->prior->prior;
【解答】A
(15)在双向循环链表中,在 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->prior = p; q->next = p->next; p->next = q; p->next->prior = q;
【解答】C
第三章 栈和队列
1. 选择题
(1)若让元素 1, 2, 3, 4, 5 依次进栈,则出栈次序不可能出现在( )种情况。
A. 5, 4, 3, 2, 1
B. 2, 1, 5, 4, 3
C. 4, 3, 1, 2, 5
D. 2, 3, 5, 4, 1
【解答】C
栈是后进先出的线性表,然而C选项中 1 比 2 先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。
A、1, 2, 3, 4, 5 依次全部进栈,再出栈,得到 5, 4, 3, 2, 1
B、1, 2 先进栈,然后出栈得到 2, 1,再 3, 4, 5 进栈,再出栈 5, 4, 3,合起来就是 2, 1, 5, 4, 3
D、1, 2 先进栈,然后 2 出栈,再 3, 4, 5 进栈,得到 2, 5, 4, 3,最后 1 出栈,就是 2, 5, 4, 3, 1
(2)若已知一个栈的入栈序列是 1,2,3… n,其输出序列为
, 若
,则
为( )。
A. i
B. n - i
C. n - i + 1
D. 不确定
【解答】C
(3)一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为( )。
A. r - f
B. ( n + f - r ) % n
C. n + r - f
D. ( n + r - f ) % n
【解答】D
对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数, 所以需要将差值加上MAXSIZE,然后与 MAXSIZE求余,即 ( r - f + n) % n 。
(4)链式栈结点为:(data, link),top 指向栈顶,若想删除栈顶节点,并将删除节点的值
保存到 x 中 ,则应执行操作( )。
A. x=top->data; top=top->link ;
B. top=top->link; x=top->link ;
C. x=top; top=top->link ;
D. x=top->link ;
【解答】A
先把将删除节点的值保存到 x 当中,即 x = top->data; 然后栈顶指针往后移,指向下一个节点,就是 top = top->link;
(5)设有一个递归算法如下
int fact(int n)
{ //n 大于等于 0
if(n <= 0) return 1;
else return n * fact(n - 1);
}
则计算 fact(n) 需要调用该函数的次数为( )。
A. n + 1
B. n - 1
C. n
D. n + 2
【解答】A
n = 0,===> fact(0)
n = 1,===> fact(1)-->fact(0)
n = 2,===> fact(2)-->fact(1)-->fact(0)
..........
(6)栈在( )中有所应用。
A. 递归调用 B. 函数调用 C. 表达式求值 D. 前三个选项都有
【解答】D
(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机
将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻
辑结构应该是( )。
A. 队列 B. 栈 C. 线性表 D. 有序表
【解答】A
解决缓冲区问题应利用一种先进先出的线性表,所以选队列。
(8)设栈 S 和队列 Q 的初始状态为空,元素
和
依次进入栈 S,
一个元素出栈后即进入 Q,若 6 个元素出队的序列是
和
,则栈 S 的容
量至少应该是( )。
A. 2 B. 3 C. 4 D. 6
【解答】B
进栈,栈里有
(2个) ,然后
出栈;
进栈,栈里有
(3个) ,然后
出栈;
进栈,栈里有
(3个) ,然后
出栈。
所以栈的容量至少是 3 。
(9)若一个栈以向量V[ 1…n ] 存储,初始栈顶指针top设为 n + 1,则元素x进栈的正确操作是( )。
A. top++; V[top] = x; B. V[top] = x; top++;
C. top--; V[top] = x; D. V[top] = x; top--;
【解答】C
栈顶指针top初始为 n + 1,那么这个数组是从后往前压的,应该先 top--,再压栈,不然第一个数就会溢出。
(10)设计一个判别表达式中左,右括号是否配对出现的算法,采用( )数据结构最佳。
A. 线性表的顺序存储结构 B. 队列
C. 线性表的链式存储结构 D. 栈
【解答】D
利用栈的后进先出原则。
(11)用链接方式存储的队列,在进行删除运算时( )。
A. 仅修改头指针 B. 仅修改尾指针
C. 头、尾指针都要修改 D. 头、尾指针可能都要修改
【解答】D
在有头节点的链队列的出队操作中,一般只需修改队头指针。但当队列中只有一个节点时,或者当队列中最后一个元素被删除时,该节点既是队头也是队尾,故删去此节点后队尾指针也会丢失,因此需对队尾指针重新赋值(指向头节点),使其指向头节点,且删去此节点后队列置空。
(12)循环队列存储在数组 A[0…m] 中,则入队时的操作为( )。
A. rear = rear + 1 B. rear = (rear + 1) % (m - 1)
C. rear = (rear + 1) % m D. rear = (rear + 1) % (m + 1)
【解答】D
数组 A[0…m] 中一共含有 m + 1 个元素,故在求模运算时应除以 m + 1。
(13)最大容量为 n 的循环队列, 队尾指针是 rear ,队头是 front ,则队空的条件是( )。
A. (rear+1)%n == front B. rear == front
C. rear+1 == front D. (rear-l)%n == front
【解答】B
最大容量为n的循环队列,队满条件是 (rear+1)%n==front,队空条件是rear==front 。
(14)栈和队列的共同点是( )。
A. 都是先进先出 B. 都是先进后出
C. 只允许在端点处插入和删除元素 D. 没有共同点
【解答】C
栈只允许在栈顶处进行插入和删除元素,队列只允许在队尾插入元素和在队头删除元素。
(15)一个递归算法必须包括( )。
A. 递归部分 B. 终止条件和递归部分
C. 迭代部分 D. 终止条件和迭代部分
【解答】B
第四章 串、数组和广义表
1. 选择题
(1)串是一种特殊的线性表,其特殊性体现在( )。
A. 可以顺序存储 B. 数据元素是一个字符
C. 可以链式存储 D. 数据元素可以是多个字符若
【解答】B
(2)串下面关于串的的叙述中,( )是不正确的。
A. 串是字符的有限序列 B. 空串是由空格构成的串
C. 模式匹配是串的一种重要运算 D. 串既可以采用顺序存储,也可以采用链式存储
【解答】B
空格常常是串的字符集合中的一个元素,由一个或多个空格组成的串成为空格
串,零个字符的串成为空串,其长度为零。
(3)串“ ababaaababaa ”的 next 数组为( )。
A. 012345678999 B. 012121111212 C. 011234223456 D. 0123012322345
【解答】C
首先 j = 1 的时候,next[1] = 0;
j = 2,1<k<2,next[2] = 1;
j = 3,1<k<3,k = 2,然后比较
与
是否相等,该题中
,则 next[3] = 1;
j = 4,1<k<4,k = 2、3;当 k = 2 时,比较
与
,
;
当 k = 3 时,比较
与
,即
;
综上,所以 next[4] = 2;
......
(4)串“ ababaabab ”的 nextval 为( )。
A. 010104101 B. 010102101 C. 010100011 D. 010101011
【解答】A
该题前六位元素"ababaa"用上题的next[j] : 011234
首先默认 j = 1 时,nextval[1] = 0;
j = 2 时,该元素(b)对应的 next 值为 1,则用该元素(b) 与 j = 1 对应的元素(a)比较,不相等,则 它对应的 nextval 值 就等于 其 next 值,即 nextval[2] = next[2] = 1;
j = 3 时,该元素(a)对应的 next 值为 1,则用该元素(a) 与 j = 1 对应的元素(a)比较,相等,则 它对应的 nextval 值 就等于 j = 1的 nextval 值,即 nextval[3] = nextval[0] = 0;
......
j = 6 时,该元素(a)对应的 next 值为 4,则用该元素(a) 与 j = 4 对应的元素(b)比较,不相等,则 它对应的 nextval 值 就等于其 next 值,即 nextval[6] = next[6] = 4;
......
(5)串的长度是指( )。
A. 串中所含不同字母的个数 B. 串中所含字符的个数
C. 串中所含不同字符的个数 D. 串中所含非空格字符的个数
【解答】B
串中字符的数目n称为串的长度。
(6)假设以行序为主序存储二维数组 A = array[1…100, 1…100] ,设每个数据元素占 2 个存
储单元,基地址为 10,则 LOC[5, 5] =( )。
A. 808 B. 818 C. 1010 D. 1020
【解答】B
以行序为主,则 LOC[5,5]=[(5-1)*100+(5-1)]*2+10=818 。
(7)设有数组 A[i,j] ,数组的每个元素长度为 3 字节, i 的值为 1 到 8,j 的值为 1 到 10,数组从内存首地址 BA 开始顺序存放, 当用以列为主存放时, 元素 A[5, 8] 的存储首地址为( )。
A. BA + 141
B. BA + 180
C. BA + 222
D. BA + 225
【解答】B
以列序为主,则 LOC[5, 8]=[(8-1)*8+(5-1)]*3+BA=BA+180 。
(8)设有一个 10 阶的对称矩阵 A ,采用压缩存储方式,以行序为主存储,
为第一元
素,其存储地址为 1,每个元素占一个地址空间,则
的地址为( )。
A. 13
B. 32
C. 33
D. 40
【解答】C
中 i = 8, j = 5, i > j,所以根据公式 i(i - 1)/2 + (j - 1) + 1,得出答案选C。
(9)若对 n 阶对称矩阵 A 以行序为主序方式将其下三角形的元素 (包括主对角线上所有元素 ) 依次存放于一维数组 B[1…(n(n + 1)) / 2] 中,则在 B 中确定
( i < j )的位置 k 的关系为( )。
A. i * (i - 1) / 2 + j
B. j * (j - 1) / 2 + i
C. i * (i +1) / 2 + j
D. j * (j +1) / 2 + i
【解答】B
(10)二维数组 A 的每个元素是由 10 个字符组成的串,其行下标 i=0, 1, , , 8,列下标 j = 1, 2, ......, 10 。若 A 按行先存储,元素 A[8, 5] 的起始地址与当 A 按列先存储时的元素( )的起始地址相同。设每个字符占一个字节。
A. A[8, 5]
B. A[3, 10]
C. A[5, 8]
D. A[0, 9]
【解答】B
设数组从内存首地址 LOC(0, 1) 开始顺序存放,若数组按行先存储,元素 A[8,5] 的起始地址为: LOC(0, 1)+[( 8-0 )*10+ (5-1)]*1=LOC(0, 1)+84 ;若数组按列先存储,易计算出元素 A[3,10] 的起始地址为: M+[ (10-1) *9+ ( 3-0 ) ]*1=M+84 。故选 B。
(11)设二维数组 A[1… m, 1… n] (即 m 行 n 列)按行存储在数组 B[1… m*n] 中,则二维
数组元素 A[i, j] 在一维数组 B 中的下标为( )。
A. ( i - 1)n + j B. ( i - 1)n + j -1 C. i ( j - 1) D. jm + i - 1
【解答】A
由题意可知 A[1, 1] = 1。
所以 A[i, j] 在一维数组 B 中的下标为 (i - 1)*n + (j - 1) + 1(首地址),即选A。
(12)数组 A[0…4, -1…-3, 5…7] 中含有元素的个数( )。
A. 55 B. 45 C. 36 D. 16
【解答】B
我们知道一个二维数组 Array[m][n]的元素个数为
。
该数组是一个三维数组,可以理解为一个长方体,0 ~ 4 共有 5 行,-1 ~ -3 共有 3 列,5 ~ 7 共有 3 纵,所以一共有 5 * 3 * 3 = 45 个元素。
(13)广义表 A = (a, b, (c, d), (e, (f, g))) ,则 Head(Tail(Head(Tail(Tail(A))))) 的值为( )。
A. (g) B. (d) C. c D. d
【解答】D
首先 Tail(A) = (b, (c, d), (e, (f, g)));
然后 Tail(Tail(A)) = ((c, d), (e, (f, g)));
然后 Head(Tail(Tail(A))) = (c, d);
Tail(Head(Tail(Tail(A)))) = (d);
Head(Tail(Head(Tail(Tail(A))))) = d
(14)广义表 ((a, b, c, d)) 的表头是() ,表尾是( )。
A. a B. ( ) C. (a,b,c,d) D. (b,c,d)
【解答】C、 B
(15)设广义表 L=((a, b, c)) ,则 L 的长度和深度分别为( )。
A. 1 和 1 B. 1 和 3 C. 1 和 2 D. 2 和 3
【解答】C
广义表的长度是指广义表中所含元素的个数,广义表的深度是指广义表中展开后所含括号的层数。所以该题中 L 的长度为 1,深度为 2。
第五章 树和二叉树
1. 选择题
(1)把一棵树转换为二叉树后,这棵二叉树的形态是( ) 。
A. 唯一的
B. 有多种
C. 有多种,但根节点都没有左孩子
D. 有多种,但根节点都没有右孩子
【解答】A
因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的
形态是唯一的。
(2)由 3 个结点可以构造出多少种不同的二叉树?( )
A. 2 B. 3 C. 4 D. 5
【解答】D
二叉树有左右之分。
(3)一棵完全二叉树上有 1001 个节点,其中叶子节点的个数是( )。
A. 250 B. 500 C. 254 D. 501
【解答】D
设
是度为 0 节点(叶子节点)个数,
是度为 1 的节点个数,
是度为 2 的节点个数,因此可得
,且
,化简得到
,由完全二叉树的性质可得
= 0 或 1,又因为
为整数,所以
= 0,
= 500,
= 501,即有 501 个叶子节点。
(4)一个具有 1025 个节点的二叉树的高 h 为( )。
A. 11 B. 10 C. 11 ~ 1025 D. 10 ~ 1024
【解答】C
若每层仅有一个节点,则树高 h 为 1025 ;
根据二叉树的性质 4 :具有 n 个节点的完全二叉树的深度为
,可知该二叉树最小数高为
, 即选C。
(5)深度为 h 的满 m叉树的第 k 层有()个节点。
A.
B.
C.
D.
【解答】A
深度为 h 的满 m 叉树共有
个节点,第 k 层有
个节点。
(6)利用二叉链表存储树,则根节点的右指针是( )。
A. 指向最左孩子 B. 指向最右孩子 C. 空 D. 非空
【解答】C
利用二叉链表表示法存储树时,右指针指向兄弟节点,因为根节点没有兄弟节点,故根节点的右指针指向空。
(7)对二叉树的节点从 1 开始进行连续编号,要求每个节点的编号大于其左、右孩子的编号,同一节点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( )遍历实现编号。
A. 先序 B. 中序 C. 后序 D. 从根开始按层次遍历
【解答】C
若是从大到小,则是中、右、左的顺序,
若是从小到大,则是左、右、中的顺序,即后序遍历。
(8)在一棵度为 4 的树 T 中,若有 20 个度为 4 的节点,10 个度为 3 的节点,1 个度为 2 的节点,10 个度为 1 的节点,则树 T 的叶节点个数是( )。
A. 41 B. 82 C. 113 D. 122
【解答】B
设树 T 的总叶子个数为 n,叶子节点的个数为
,度为 2 的节点的个数为
,度为 3 的节点的个数为
,度为 4 的节点的个数为
,
所以
,
又因为 n = B(分支总数) + 1,
可算出
,
所以 n = 122 + 1 = 123 = 41 +
,由此可算出叶子节点个数为82。
(9)在下列存储结构表示法中,( )不是树的存储结构表示法。
A. 双亲表示法 B. 孩子链表表示法 C. 孩子兄弟表示法 D. 顺序存储表示法
【解答】D
树的存储结构有三种:双亲表示法、孩子表示法、孩子兄弟表示法,其中孩子兄弟表示法是常用的表示法,任意一棵树都能通过孩子兄弟表示法转换为二叉树进行存储。
(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足( )。
A. 所有的节点均无左孩子
B. 所有的节点均无右孩子
C. 只有一个叶子节点
D. 是任意一棵二叉树
【解答】C
因为先序遍历结果是“中左右” ,后序遍历结果是“左右中” ,当没有左子树时,就是“中右”和“右中” ;当没有右子树时,就是“中左”和“左中” 。则所有的节点均无左孩子或所有的节点均无右孩子均可,但题目问的是一定满足的条件,所以 A、B 不能选,又所有的节点均无左孩子与所有的结点均无右孩子时,均只有一个叶子节点,故选 C。
(11)设哈夫曼树中有 199 个节点,则该哈夫曼树中有( )个叶子节点。
A. 99 B. 100 C. 101 D. 102
【解答】B
在哈夫曼树中没有度为 1 的节点,只有度为 0(叶子节点)和度为 2 的节点。设叶子节点的个数为
,度为 2 的节点的个数为
,由二叉树的性质
,则总节点数
,得到
。
(12)若 X 是二叉中序线索树中一个有左孩子的节点,且 X 不为根,则 X 的前驱为( )。
A. X 的双亲
B. X 的右子树中最左的节点
C. X 的左子树中最右节点
D. X 的左子树中最右叶节点
【解答】C
例如下图中的二叉树,X的前驱为 F 。
(13)引入二叉线索树的目的是( )。
A. 加快查找节点的前驱或后继的速度
B. 为了能在二叉树中方便的进行插入与删除
C. 为了能方便的找到双亲
D. 使二叉树的遍历结果唯一
【解答】A
(14)设 F 是一个森林, B 是由 F 变换得的二叉树。若 F 中有 n 个非终端节点,则 B 中右指针域为空的节点有( )个。
A. n - 1 B. n C. n + 1 D. n + 2
【解答】C
森林转换成二叉树,即用到孩子兄弟表示法。
非终端节点有 n 个,设森林总节点个数为 m,则终端节点(即叶子节点)个数为 m - n,一个节点有两个指针域,左孩子右兄弟,所以总指针域个数为 2m 个。
根据二叉树的特性,可知在 m 个节点的二叉链表中,有 m + 1 个空指针域。
【除根节点外,每出现一个节点就会占用其父节点的一个指针域,所以占据 m - 1个指针域,即使用的指针域为 m - 1,所以空指针域为 2m - (m - 1) = m + 1】(这里不需要考虑孩子兄弟表示法,就是普通的一个二叉树)
终端节点转化为二叉树后,该节点没有左孩子,左指针域就为空,即 m - n。
因为森林转二叉树后,左孩子是第一个孩子,右孩子是兄弟,所以终端节点转化后一定无左孩子,右孩子可能有也可能没有,也就是说转化后有两种可能,一是仍为叶子节点,二为不再是叶子节点,但只有右孩子。
右指针域为空个数 = 总的空指针域个数 - 左指针域为空的个数
所以右指针域为空的个数为:(m + 1) - (m - n) = n + 1。
(15)
个权值均不相同的字符构成哈夫曼树, 关于该树的叙述中, 错误的是( )。
A. 该树一定是一棵完全二叉树
B. 树中一定没有度为 1 的节点
C. 树中两个权值最小的节点一定是兄弟节点
D. 树中任一非叶节点的权值一定不小于下一层任一节点的权值
【解答】A
哈夫曼树的构造过程是每次都选取权值最小的树作为左右子树构造一棵新的二叉树,所以树中一定没有度为 1 的节点、两个权值最小的结点一定是兄弟节点、任一非叶节点的权值一定不小于下一层任一节点的权值。
第六章 图
1. 选择题
(1)在一个无向图中,所有顶点的度数之和等于图的边数的( )倍。
A. 1/2 B. 1 C. 2 D. 4
【解答】C
每条边连接两个顶点,因此每条边对应顶点的度数为2,因此所有顶点的度数之和等于所有边数的2倍。
(2)在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的( )倍。
A. 1/2 B. 1 C. 2 D. 4
【解答】B
有向图中所有顶点入度之和等于所有顶点出度之和。
(3)具有 n 个顶点的有向图最多有( )条边。
A. n B. n(n-1) C. n(n+1) D.
【解答】B
每个顶点都可以有 (n - 1) 条边,又因为有向图有方向之分,然后 n 个顶点,就最多有 n(n - 1)条边。
若是具有 n 个顶点的无向图,则最多有 n(n - 1)/2 条边。因为无向图没有方向。
(4)n 个顶点的连通图用邻接距阵表示时,该距阵至少有( )个非零元素。
A. n B. 2(n-1) C. n/2 D.
【解答】B
所谓连通图一定是无向图,有向的叫做强连通图。
连通图:任意一个顶点到另一个顶点直接都有路径。(注!!路径并非指一条边)
完全图:任意两个点都有一条边相连。
连通图
完全图
连通图有 n 个顶点,则至少只需要 n - 1 条边。由于无向图的每条边同时关联了两个顶点,因此邻接矩阵中每条边被存储了两次(也就是对称矩阵),因此至少有 2(n - 1) 个非零元素。
(5)G 是一个非连通无向图,共有 28 条边,则该图至少有( )个顶点。
A. 7 B. 8 C. 9 D. 10
【解答】C
与第(3)题类似。
若是具有 n 个顶点的无向图,则最多有 n(n - 1)/2 条边。
8 个顶点的无向图最多有 8(8 - 1)/2 = 28 条边,此时的话就是连通图,所以需要再添加一个点即构成非连通无向图,故至少有 9 个顶点。第九个节点是孤立的,不与任何节点通。
(6)若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是( )图。
A. 非连通 B. 连通 C. 强连通 D. 有向
【解答】B
首先题目中是无向图,所以排除 C、D 两个选项。
从该无向图任意一个顶点出发有到各个顶点的路径, 所以该无向图是连通图。
(7)下面( )算法适合构造一个稠密图 G 的最小生成树。
A. 普里姆算法(Prim) B. 克鲁斯卡尔算法(Kruskal)
C. 弗洛伊德算法(Floyd) D. 迪杰斯特拉算法(Dijkstra)
【解答】A
普里姆算法适合构造一个稠密图 G 的最小生成树。(归并顶点)
克鲁斯卡尔算法适合构造一个稀疏图 G 的最小生成树。(归并边)
弗洛伊德算法是求每一对顶点之间的最短路径。
迪杰斯特拉算法是就从某个源点到其余各顶点的最短路径。
(8)用邻接表表示图进行广度优先遍历时,通常借助( )来实现算法。
A. 栈 B. 队列 C. 树 D. 图
【解答】B
广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。
深度优先遍历使用递归实现,故用到了栈。
广度优先遍历,每次需要确保当前层的所有结点被访问到,要用队列存储。
(9)用邻接表表示图进行深度优先遍历时,通常借助( )来实现算法。
A. 栈 B. 队列 C. 树 D. 图
【解答】A
(10)深度优先遍历类似于二叉树的( )。
A. 先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历
【解答】A
(11)广度优先遍历类似于二叉树的( )。
A. 先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历
【解答】D
(12)图的 BFS 生成树的树高比 DFS 生成树的树高( )。
A. 小 B. 相等 C. 小或相等 D. 大或相等
【解答】C
BFS:广度优先遍历 DFS:深度优先遍历
对于一些特殊的图,比如只有一个顶点的图,其 BFS 生成树的树高和 DFS 生成树的树高相等。一般的图,根据图的 BFS 生成树和 DFS 树的算法思想, BFS 生成树的树高比 DFS 生成树的树高小。
(13)已知图的邻接矩阵如图 6.30 所示, 则从顶点
出发按深度优先遍历的结果是( )。
【解答】C
按深度优先遍历:
从
开始,看第一行,假设它先遇到的是
(也可以是
、
、
、
);
然后再看
这一行,这里
到
这个就不需要再看了,因为
的时候已经算过了,再假设先遇到的顶点是
(也可以是
);
再看
这一行,先遇到
,再看
这一行,先遇到
,再看
这一行,发现 0 和 4 都遍历过了,退回到
,
也遍历过了,遇到
,看
这一行,遇到
,结束。
综上就是 0 1 3 4 2 5 6 ,所以选 C。
邻接矩阵唯一 =====> 深度遍历结果不唯一
再以选项 A 为例:
首先
到
,然后看
这一行,到
,再到
,再到
,然后看
这一行,发现
到
是没有路径的,所以 A 选项错误。
(14)已知图的邻接表如图 6.31 所示,则从顶点
出发按广度优先遍历的结果是( ),按深度优先遍历的结果是( )。
A. 0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3
【解答】D、D
由该链表可知,此图为无向图。
广度优先遍历,则先从
出发,直接读取邻接表第一行,即 0 1 2 3。
深度优先遍历,从
出发,到
,再看
那一行,到
,最后再到
,即 0 1 2 3。
如果根据该链表将此无向图画出来,再根据图按广度优先遍历的话,C 选项也可以,但是该题已经给出了链表,所以已经确定了遍历的顺序,故只能先遍历
。
(15)下面( )方法可以判断出一个有向图是否有环。
A. 深度优先遍历 B. 拓扑排序 C. 求最短路径 D. 求关键路径
【解答】B
第七章 查找
1. 选择题
(1)对 n 个元素的表做顺序查找时, 若查找每个元素的概率相同, 则平均查找长度为( )。
A. (n-1) / 2
B. n / 2
C. (n+1) / 2
D. n
【解答】C
总查找次数N = 1 + 2 + 3 + ...... + n = n(n+1) / 2 ,则平均查找长度为 N / n = (n+1) / 2。
因为每个元素查找的概率相同,所以
,
故
(2)适用于折半查找的表的存储方式及元素排列要求为( )。
A. 链接方式存储,元素无序
B. 链接方式存储,元素有序
C. 顺序方式存储,元素无序
D. 顺序方式存储,元素有序
【解答】D
折半查找要求线性表必须采用顺序存储结构, 而且表中元素按关键字有序排列。
(3)如果要求一个线性表既能较快的查找,又能适应动态变化的要求,最好采用( )查找法。
A. 顺序查找 B. 折半查找 C.分块查找 D. 哈希查找
【解答】C
分块查找的优点是: 在表中插入和删除数据元素时, 只要找到该元素对应的块,就可以在该块内进行插入和删除运算。由于块内是无序的,故插入和删除比较容易,无需进行大量移动。如果线性表既要快速查找又经常动态变化,则可采用分块查找。
(4)折半查找有序表( 4, 6, 10, 12, 20 , 30 , 50 , 70 , 88 , 100 )。若查找表中元素58,则它将依次与表中( )比较大小,查找结果是失败。
A. 20 , 70, 30, 50
B. 30, 88, 70 , 50
C. 20 , 50
D. 30 , 88, 50
【解答】A
表中共 10 个元素, 第一次取 mid=(1+10)/2=5,与第五个元素 20 比较, 58 大于 20,low=mid+1,即看[6,10],再取 (6+10)/2=8,与第八个元素 70 比较,依次类推再与 30 、 50 比较,最终查找失败。
(5)对 22 个记录的有序表作折半查找,当查找失败时,至少需要比较( )次关键字。
A. 3 B. 4 C. 5 D. 6
【解答】B
22 个记录的有序表,其折半查找的判定树深度为
,且该判定树不是满二叉树,即查找失败时至多比较 5 次,至少比较 4 次。
至少需要4次,
第一次:与第11个位置上的数进行比较 mid=(1+22)/2=11,查找失败进入[1,10]区域进行查找
第二次:与第5个位置上的数进行比较 mid=(1+10)/2=5,查找失败进入[1,4]区域进行查找
第三次:与第2个位置上的数进行比较 mid=(1+4)/2=2,查找失败进入[1,2]区域进行查找
第四次:与第1个位置上的数进行比较 查找失败说明不存在该关键字
(6)折半搜索与二叉排序树的时间性能( )。
A. 相同 B. 完全不同 C. 有时不相同 D. 数量级都是
【解答】C
(7)分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( )。
A.( 100 , 80, 90 , 60, 120 , 110 , 130)
B.( 100 , 120 , 110 , 130 , 80, 60 , 90)
C.( 100 , 60, 80 , 90, 120 , 110 , 130)
D.(100 , 80 , 60, 90 , 120 , 130 , 110)
【解答】C
A 、 B、 C、 D 四个选项构造二叉排序树都以 100 为根,易知 A 、 B、 D 三个序列中第一个比 100 小的关键字为 80,即 100 的左孩子为 80 ,而 C 选项中 100 的左孩子为 60,故选 C。
A、B、D所构造的二叉排序树如下:
而 C 选项对应的二叉排序树如下:
(8)在平衡二叉树中插入一个节点后造成了不平衡,设最低的不平衡节点为 A ,并已知A 的左孩子的平衡因子为 0 右孩子的平衡因子为 1,则应作( )型调整以使其平衡。
A. LL B. LR C. RL D. RR
【解答】C
该题最简单的插入后的树如下:
由图可知,是在右孩子的左孩子进行插入,故应进行 RL 旋转调整。
(9)下列关于 m 阶 B- 树的说法错误的是( )。
A. 根节点至多有 m 棵子树
B. 所有叶子都在同一层次上
C. 非叶节点至少有 m/2 (m 为偶数 )或 m/2+1 ( m 为奇数)棵子树
D. 根节点中的数据是有序的
【解答】C
根节点关键字数量最少为 1,最多为 m - 1。
其他非叶节点关键字数量最少为 m / 2 (向上取整),最多为 m - 1。
根节点可以为终端节点,那么没有子树。
(10)下面关于 B- 和 B+ 树的叙述中,不正确的是( )。
A. B- 树和 B+ 树都是平衡的多叉树
B. B- 树和 B+ 树都可用于文件的索引结构
C. B- 树和 B+ 树都能有效地支持顺序检索
D. B- 树和 B+ 树都能有效地支持随机检索
【解答】C
(11)m 阶 B- 树是一棵( )。
A. m 叉排序树
B. m 叉平衡排序树
C. m-1 叉平衡排序树
D. m+1 叉平衡排序树
【解答】B
(12)下面关于哈希查找的说法,正确的是( )。
A. 哈希函数构造的越复杂越好,因为这样随机性好,冲突小
B. 除留余数法是所有哈希函数中最好的
C. 不存在特别好与坏的哈希函数,要视情况而定
D. 哈希表的平均查找长度有时也和记录总数有关
【解答】C
(13)下面关于哈希查找的说法,不正确的是( )。
A. 采用链地址法处理冲突时,查找一个元素的时间是相同的
B. 采用链地址法处理冲突时,若插入规定总是在链首,则插入任一个元素的时间是相同的
C. 用链地址法处理冲突,不会引起二次聚集现象
D. 用链地址法处理冲突,适合表长不确定的情况
【解答】A
在同义词构成的单链表中,查找该单链表表中不同元素,所消耗的时间不同 。
(14)设哈希表长为14,哈希函数是 H(key)=key%11,表中已有数据的关键字为15,38,61, 84 共四个,现要将关键字为49的元素加到表中,用二次探测法解决冲突,则放入的位置是( )。
A. 8 B. 3 C. 5 D. 9
【解答】D
关键字 15 放入位置 4,关键字 38 放入位置 5,关键字 61 放入位置 6,关键字 84放入位置 7,再添加关键字 49,计算得到地址为 5,冲突,用二次探测法解决冲突得到新地址为 6,仍冲突,再用用二次探测法解决冲突,得到新地址为 4,仍冲突,再用用二次探测法解决冲突,得到新地址为 9,不冲突,即将关键字 49 放入位置 9。
(15)采用线性探测法处理冲突,可能要探测多个位置,在查找成功的情况下,所探测的这些位置上的关键字( )。
A. 不一定都是同义词 B. 一定都是同义词 C. 一定都不是同义词 D. 都相同
【解答】A
所探测的这些关键字可能是在处理其它关键字冲突过程中放入该位置的。
第八章 排序
1. 选择题
(1)从未排序序列中依次取出元素与已排序序列中的元素进行比较, 将其放入已排序序
列的正确位置上的方法,这种排序方法称为( )。
A. 归并排序 B. 冒泡排序 C. 插入排序 D. 选择排序
【解答】C
(2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方
法,称为( )。
A. 归并排序 B. 冒泡排序 C. 插入排序 D. 选择排序
【解答】D
(3)对 n 个不同的关键字由小到大进行冒泡排序,在下列( )情况下比较的次数最多。
A. 从小到大排列好的 B. 从大到小排列好的 B. 元素无序 B. 元素基本有序
【解答】B
对关键字进行冒泡排序,关键字逆序时比较次数最多。
(4)对 n 个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为( ) 。
A. n+1 B. n B. n-1 B. n(n-1)/2
【解答】D
比较次数最多时,第一次比较 n-1 次,第二次比较 n-2 次, 最后一次比较 1 次,
即 (n-1) + (n-2) +......+ 1 = n(n-1)/2
(5)快速排序在下列( )情况下最易发挥其长处。
A. 被排序的数据中含有多个相同排序码
B. 被排序的数据已基本有序
B. 被排序的数据完全无序
B. 被排序的数据中的最大值和最小值相差悬殊
【解答】C
B 选项是快速排序的最坏情况。
(6)对 n 个关键字作快速排序,在最坏情况下,算法的时间复杂度是( )。
A. O(n) B. O(
) B. O(
) B. O(
)
【解答】B
快速排序的平均时间复杂度为 O(
) ,但在最坏情况下,即关键字基本排好
序的情况下,时间复杂度为 O(
)。
(7)若一组记录的排序码为( 46, 79 ,56 ,38 ,40 ,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( )。
A. 38 , 40, 46, 56 , 79, 84
B. 40, 38, 46 , 79, 56 , 84
B. 40 , 38, 46 , 56, 79, 84
B. 40, 38, 46 , 84, 56 , 79
【解答】C
(8)下列关键字序列中,( )是堆。
A. 16 , 72, 31, 23 , 94, 53
B. 94, 23 , 31 , 72 , 16, 53
B. 16 , 53, 23 , 94, 31, 72
B. 16 , 23, 53 , 31, 94, 72
【解答】D
D 选项为小根堆
(9)堆是一种( )排序。
A. 插入 B. 选择 B. 交换 B. 归并
【解答】B
(10)堆的形状是一棵( )。
A. 二叉排序树 B. 满二叉树 B. 完全二叉树 B. 平衡二叉树
【解答】C
(11)若一组记录的排序码为( 46, 79,56 , 38, 40,84 ),则利用堆排序的方法建立的
初始堆为( )。
A. 79 , 46, 56, 38 , 40, 84
B. 84, 79, 56 , 38, 40 , 46
B. 84 , 79, 56 , 46, 40, 38
B. 84, 56, 79 , 40, 46 , 38
【解答】B
(12)下述几种排序方法中,要求内存最大的是( )。
A. 希尔排序 B. 快速排序 C. 归并排序 D. 堆排序
【解答】C
堆排序、希尔排序的空间复杂度为 O(1) ,快速排序的空间复杂度为 O(log 2n),
归并排序的空间复杂度为 O(n) 。
(13)下述几种排序方法中,( )是稳定的排序方法。
A. 希尔排序 B. 快速排序 C. 归并排序 D. 堆排序
【解答】C
不稳定排序有:希尔排序、简单选择排序、快速排序、堆排序。
稳定排序有:直接插入排序、折半插入排序、冒泡排序、归并排序、基数排序。
(14)数据表中有 10000 个元素,如果仅要求求出其中最大的 10 个元素,则采用( )算法最节省时间。
A. 冒泡排序 B. 快速排序 C. 简单选择排序 D. 堆排序
【解答】D
(15)下列排序算法中,( )不能保证每趟排序至少能将一个元素放到其最终的位置上。
A. 希尔排序 B. 快速排序 C. 冒泡排序 D. 堆排序
【解答】A
快速排序的每趟排序能将作为枢轴的元素放到最终位置。
冒泡排序的每趟排序能将最大或最小的元素放到最终位置。
堆排序的每趟排序能将最大或最小的元素放到最终位置。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。