中国大学MOOC-陈越、何钦铭-数据结构-2019夏期中考试+解析
判断题
1-1 用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。 (3分)TRUE
[解析]:邻接矩阵是用一维数组存储图中顶点的信息,二维数组表示图中顶点之间的邻接关系。其中二维数组中的信息是点的信息,所以与边无关
邻接矩阵利用矩阵来表示每两个顶点之间的关系,所以只和顶点个数有关
邻接表保存顶点和其边的信息,所以和结点个数有关,与边数有关
1-2 如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G一定有2个连通分量。 (3分) TRUE
[解析]:无向图G的极大连通子图称为G的最强连通分量 ① 任何连通图的连通分量只有一个,即是其自身 ② 非连通的无向图有多个连通分量。
1-3 在具有N个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。 (3分)FALSE
[解析]:访问结点的时间复杂度与待查找的值有关,O((n-1)/2))也就是O(n)
增加结点前,需要先找到第i-1个结点。故查找时间为O(n),插入时间为O(1),所以增加结点时间为O(n)
1-4 在一棵由包含4、5、6等等一系列整数结点构成的二叉搜索树中,如果结点4和6在树的同一层,那么可以断定结点5一定是结点4和6的父亲结点。 (3分)FALSE
[解析]:5可能是4和6的祖先
例如:4是5的左孩子的右孩子,6是5的右孩子的左孩子
1-5 将1、2、3、4、5、6顺序插入初始为空的AVL树中,当完成这6个元素的插入后,该AVL树的先序遍历结果是:4、2、1、3、5、6。 (3分)TRUE
[解析]:教材定义:
平衡二叉树或者是空树,或者是具有如下特征的二叉排序树
1. 左子树和右子树的深度之差的绝对值不超过1
2. 左子树和右子树也是平衡二叉树
1-6 一棵有124个结点的完全二叉树,其叶结点个数是确定的。 (3分)TRUE
[解析]:满二叉树:深度为k且含有2^k-1个结点的二叉树
完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之满二叉树
1-7 通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。 (3分)FALSE
[解析]:Push(S,1), Push(S,2),栈内从上到下为2,1
Pop(S),弹出栈顶元素2
Push(S,3),入栈3,栈内从上到下为3,1
Pop(S), Pop(S),弹出栈顶元素3,弹出栈顶元素1
因此输出的序列为:231
1-8 算法可以没有输入,但是必须有输出。 (2分)TRUE
[解析]:算法是为了解决某类问题而规定的一个有限长的操作序列
一个算法必须满足以下五种重要特性。
(1)有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
(2)确定性。对于每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
(3)可行性。算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
(4)输入。一个算法有零个或者多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
(5)输出。一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。
1-9 所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。 (2分)FALSE
[解析]:错误,循环队列指的是后者,用数组表示的队列,利用求余运算使得头尾相接
1-10 已知一棵二叉树的先序遍历结果是ABC, 则CAB不可能是中序遍历结果。 (3分)TRUE
[解析]:先序遍历是ABC,那么A一定是根节点。
假设CAB是中序遍历结果,那么C是A的左节点,B是A的右节点。此时先序遍历结果是ACB,故假设不成立。
选择题
2-1 已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则该完全二叉树的结点个数最多是: (4分)答案为111
-
39
-
52
-
111
-
119
[解析]:第6层有32个结点,其中8个为叶结点,则24个是有孩子的结点。
问题是最多有多少结点,那么第7层最多有48个结点。
总共最多的结点:前6层的共有2^6-1个结点 + 第7层最多的48个结点 = (64-1)+ 48 = 111
2-2 在并查集问题中,已知集合元素0~8所以对应的父结点编号值分别是{ 1, -4, 1, 1, -3, 4, 4, 8, -2 }(注:−n表示树根且对应集合大小为n),那么将元素6和8所在的集合合并(要求必须将小集合并到大集合)后,该集合对应的树根和父结点编号值分别是多少? (4分)答案为4和-5
-
1和-6
-
4和-5
-
8和-5
-
8和-6
[解析]:因为小集合合并到大集合,456为大集合,89为小集合。所以结果如下。树根为4,对应集合大小为5,父节点编号值为-5。
2-3 三叉树中,度为1的结点有5个,度为2的结点3个,度为3的结点2个,问该树含有几个叶结点? (4分)答案为8
-
8
-
10
-
12
-
13
[解析]:三叉树中结点总数 = 边数 + 1 = (15)+(23)+(3*2)+ 1 = 18
结点总数 = 度为0的结点n0 + 度为1的结点n1 + 度为2的结点n2 +度为3的结点n3 = n0 + 5 + 3 + 2 = n0 + 10
由上可推,n0 + 10 = 18,故n0 = 8
2-4 循环顺序队列中是否可以插入下一个元素()。 (4分)答案为与队头指针和队尾指针的值有关
-
与队头指针和队尾指针的值有关
-
只与队尾指针的值有关,与队头指针的值无关
-
只与数组大小有关,与队首指针和队尾指针的值无关
-
与曾经进行过多少次插入操作有关
[解析]教材中判断队满操作,方法一:尾指针在循环意义上+1后是等于头指针
方法二:另设一个标志位以区别队列是空是满
2-5
若某图的深度优先搜索序列是{V1, V4, V0, V3, V2},则下列哪个图不可能对应该序列? (4分)答案为第三个图
[解析]:第3个图的深度优先搜索序列是{V1, V4, V3, V0, V2}或者{V1, V0, V2, V4, V3}
2-6 假设有5个整数以1、2、3、4、5的顺序被压入堆栈,且出栈顺序为3、5、4、2、1,那么为了获得这样的输出,堆栈大小至少为: (4分)答案为4
-
2
-
3
-
4
-
5
[解析]:出栈3,则栈内从上到下为3,2,1,此时栈的大小为3
出栈5,则栈内从上到下为5,4,2,1,此时栈的大小为4
出栈4,则栈内从上到下为4,2,1,此时栈的大小为3
出栈2,则栈内从上到下为2,1,此时栈的大小为2
出栈1,则栈内从上到下为1,此时栈的大小为1
综上,堆栈大小至少为4
2-7 设一段文本中包含4个对象{a,b,c,d},其出现次数相应为{4,2,5,1},则该段文本的哈夫曼编码比采用等长方式的编码节省了多少位数? (4分)答案为2
-
0
-
2
-
4
-
5
[解析]:
2-8 下列代码
for(i=0; i<n; i++) for(j=i; j>0; j/=2) printf(“%d\n”, j);
的时间复杂度是: (4分)答案为O(NlogN)
-
O(N×i)
-
O(N)
-
O(N^2)
-
O(NlogN)
[解析]:for(i=0; i<n; i++)执行了n次
for(j=i; j>0; j/=2)执行了logn次
printf(“%d\n”, j);执行了nlogn次,所以时间复杂度O(NlogN)
2-9 将{5, 2, 7, 3, 4, 1, 6}依次插入初始为空的二叉搜索树。则该树的后序遍历结果是:(4分)答案为1, 4, 3, 2, 6, 7, 5
-
1, 2, 3, 4, 6, 7, 5
-
1, 4, 2, 6, 3, 7, 5
-
1, 4, 3, 2, 6, 7, 5
-
5, 4, 3, 7, 6, 2, 1
[解析]:
2-10 对最小堆(小顶堆){1,3,2,12,6,4,8,15,14,9,7,5,11,13,10} 进行三次删除最小元的操作后,结果序列为:(4分)答案是4,6,5,12,7,10,8,15,14,9,13,11
-
4,5,6,7,8,9,10,11,12,13,14,15
-
4,6,5,13,7,10,8,15,14,12,9,11
-
4,6,5,12,7,10,8,15,14,9,13,11
-
4,5,6,12,7,10,8,15,14,13,9,11
[解析]:
2-11 带头结点的单链表h
为空的判定条件是: (4分)答案为h->next == NULL;
-
h == NULL;
-
h->next == NULL;
-
h->next == h;
-
h != NULL;
[解析]:1.是不带头结点的单链表h为空的判断条件,2、错误语句,3、不带头结点的单链表h不为空的判断条件
2-12 下列函数中,哪个函数具有最慢的增长速度:(4分)答案为Nlog (N^2)
-
N^1.5
-
Nlog (N^2)
-
(N^2)logN
-
N(logN)^2
[解析]:
来自csdn
https://blog.csdn.net/huangxiaominglipeng/article/details/40348373
编程题
5-1 下列代码的功能是将小顶堆H
中指定位置P
上的元素的整数键值下调D
个单位,然后继续将H
调整为小顶堆。
void DecreaseKey( int P, int D, PriorityQueue H ) { int i, key; key = H->Elements[P] - D; for ( i = /************/(6分); H->Elements[i/2] > key; i/=2 ) /************/(6分); H->Elements[i] = key; } 1.P 2.H->Elements[i] = H->Elements[i/2]
5-2 下列代码的功能是返回带头结点的单链表L
的逆转链表。
List Reverse( List L ) { Position Old_head, New_head, Temp; New_head = NULL; Old_head = L->Next; while ( Old_head ) { Temp = Old_head->Next; /************/(6分); New_head = Old_head; Old_head = Temp; } /************/(6分); return L; } 1.Old_head->next = New_head; 2.L->next = New_head;