2020 - 951 数据结构
题目
一、单项选择题
1. 计算机算法指的是 ( )。
A. 计算方法 B. 解决问题的步骤序列 C. 排序方法 D. 调度方法
2.顺序表比链表 ( )。
A. 更便于随机读取 B. 数据元素的物理存储范围更分散
C. 插入和删除更简便 D. 更适合线性逻辑结构
3.在一个长度为n的顺序表的第i(1≤i≤n+1) 个位置上插入一个元素,需要后移(个元素。
A. n-i B. n-i-1 C. n-i+1 D. n+i
4.要从一个顺序表删除一个元素时,被删除元素之后的所有元素均需( )一个位置,移动过程是从( ) 向( )依次移动一个元素。
A. 前移, 后, 前 B. 前移, 前, 后
C. 后移, 后, 前 D. 后移, 前, 后
5.向一个栈顶指针为top的链栈中插入一个s结点,应执行( )
A. top->next=s;
B. s->next=top;top=s;
C. s->next=top->next;top->next=s;
D. s > next=top; top=top->next;
6. 设某二叉树中度数为0 的结点数为 No,度数为 1 的结点数为N1,度数为2的 结点数为N₂,则下列等式成立的是( )。
A.N0 = N1+1
B.N0 = N1 + N2
C.N0 = N2 +1
D.N0 = 2N + L
7. 一棵二叉树的后序遍历序列为C、A、E、B、D,中序遍历序列为D、A、C、B、E,则先序遍历序列为(
A. D、 B、 A、 C、 E B. D、 A、 B、 E、 C
C. C、E、 D、 B、 A↓ D. C、 B、 D、 A、 Ex
8. Huffman树的带权路径长度等于( )。
A. 除根结点之外的所有结点权值之和 B. 所有结点权值之和
C. 各叶子结点的带权路径长度之和 D. 根结点的值
9. 设有6个顶点的无向图,该图至少有( )条边,才能确保是一个连通图。
A.5 B.6 C.7 D.8
10. 设某无向图中有n个顶点e条边,则建立该图邻接表的时间复杂度为(
A. O(n+c) C. O(ne) D. O(n³)
11. 若图的邻接矩阵中主对角线上的元素全是0,其余元素全是1,则可以断定该图一定是 ( )。
A. 无向图 B. 不是带权图 C. 有向图 D. 完全图
12.已知采用开放地址法解决散列表冲突,要从此散列表中删除一个记录,正确的做法是( )
A. 将该元素所在的存储单元清空。
B. 在该元素上做删除标记。
C.将与该元素有相同Hash地址的后继元素顺次前移一个位置。
D. 用与该元素有相同Hash地址的最后插入表中的元素替代。
13. 散列函数有一个共同性质, 即函数值应当以( )取其值域的每个值。
A. 最大概率 B. 最小概率 C. 平均概率 D. 等概率
14. 快速排序方法在( )情况下最不利于发挥其长处。
A. 要排序的数据量太大 B. 要排序的数据中含有多个相同值
C. 要排序的数据已基本有序 D. 要排序的数据个数为奇数
15.在归并排序过程中,需归并的趟数为( B )。
A. √n B.「lbn| C. n D. Libn」
二、判断题
1. 线性表中的所有元素都有一个前驱元素和后继元素。( )
2. 栈和队列的存储方式只能是链接方式。(
3. 查找和修改是对数组的基本操作。( )
4. 二叉树的后序遍历序列中,任意一个结点均处在其孩子结点的后面。( )
5. 一个含有n个结点的完全二叉树,它的高度是 ( )
6.当向二叉排序树中插入一个结点,则该结点一定成为叶子结点。(
7.调用一次深度优先遍历可以访问到图中的所有顶点。( )
8. 带权无向图的最小生成树是唯一的。( )
9. 如果表示某个图的邻接矩阵是不对称矩阵,则该图一定是有向图。( )
10. 在一个有向图的拓扑序列中,若顶点a在顶点b之前,则图中必有一条弧<a,b>。( x )
11.在散列法中, 散列函数必须是一个一对一的函数。 ( )
12. 散列表发生冲突的可能性与装填因子无关。( )
13.索引顺序结构和索引非顺序结构的索引表中索引项都是按照关键字顺序排列的。(✔)
14. 对 n 个元素执行快速排序,在进行第一次划分时,关键字的比较次数总是 n-1 次。( )
15.归并排序算法中辅助数组所需的空间复杂度为O(n)。( )
三、填空题
1.数据的物理结构主要包括 和 两种情况。
2.顺序表中逻辑上 的元素的物理位置相邻。
3. 在双向循环链表中,在 m 所指的结点之后插入 n 指针所指的结点,其操作是 , n >next=m >next; m >next >prior=n;m >next=n。
4. 设有一个空栈,现有输入序列(a,b,c,d,e), 经过 push, push, pop, push, pop, push,push的操作, 输出序列是 .
5.两个字符串相等的充要条件是两个串的 相等和对应位置的字符相等。
6,装有n个叶子的哈夫曼树的结点总数为 .
7.设二叉树中结点的两个指针域分别为Ichild 和rchild,则判断指针变量 p 所指向的结点为叶子结点的条件是 。
8.根据初始关键字序列(19、22、01、38、10)建立的二叉排序树的高度为 。
9.设一棵二叉树的前序序列为ABC,则有 种不同的二叉树可以得到这种序列。
10.解决散列表冲突的两种方法是 和 .
11.对于一个具有n个顶点和e条边的无向图,如果采用邻接表存储方法存储该无向图,边表中所含结点有 个。
12.在 个具有n个顶点的完全有向图中,包含有 条边。
13.设某无向图中顶点数和边数分别为n和c,所有顶点的度数之和为d,则(
14.对 个长度为n的任意文件进行排序,至少需要 次比较。
13.对n个元素进行冒泡排序时,最少的比较次数是 。
四、问题求解题
1. (7分) 假设字符集{a,b,c,d,e,f}对应的权重为{45,13,12,16,9,5}。
(1) 为这6个字符建立 Haffman树,并给出相应的 Haffman编码,要求左子树权重小于右子树且编码时左边为0右边为1。
(2) 求出 Haffman树的带权路径长度 WPL。
2. (8分)设完全二叉树的顺序存储结构中存储数据ABCDE,要求画出该完全二叉树并给出该二叉树的前序、中序和后序遍历序列。
3 (7分)一个线性表为 B=(12,23,45,57,20,03,78,31,15,36),设散列表为 HT[0…12],散列函数为 H(key)=key%13 并用线性探查法解决冲突,请画出散列表,并计算等概率情况下查找成功的平均查找长度。
4 (7分)下图是有5个顶点(1,2,3,4,5)的无向图。请回答相关问题:
(1) 请画出该图的邻接矩阵和邻接表。
(2) 若该图采用邻接矩阵表示,按邻接点序号从小到大选择,给出从顶点2开始的广度优先搜索序列。
(3) 在广度优先搜索算法中,除了邻接矩阵,还使用了什么数据结构?
5 (8分)有 6 个顶点(v₀,V₁,V₂,V₃,V₄, vs)的有向图的邻接矩阵如下图。请回答相关问题:
(1) 画出该有向图。
(2) 求从顶点 v₀开始到其余顶点的最短路径。按最短路径生成的次序填写下表。
步骤 |
最短路径点集S |
选择的顶点 |
源点到各顶点的长度 D[0]D[1]D[2]D[3]D[4]D[5] |
初始 |
{0} |
· |
0 oo 10 ∞ 30 100 |
第一步 |
{0,2} |
2 |
|
第二步 |
|
|
|
第三步 |
|
|
|
第四步 |
|
|
|
第五步 |
|
|
|
6. (8分)某人去超市购物,设有n种物品,第i种物品的重量为wᵢ,价值为vᵢ,一个人最多能带的重量为c(c>0)。
(1) 请设计一个算法使得一个人能带走的物品价值最大。
(2) 如果有 3 种物品, 第一种物品是大米重5 公斤,价值 50 元; 第二种物品是面粉重10 公斤, 价值 80元;第三种物品是土豆重15公斤, 价值45元。 已知一个人最多能带25 公斤。根据设计的算法,给出最优的方案(每种物品的携带数量)。
五、算法题
1. (10分)已知线性表的元素是无序的,实现一个删除表中所有值小于 max但大于 min 的元素的算法,该线性表以带头结点的单链表为存储结构。
void delete(LinkList *head, int max, int min)
{
LinkList *p, *q;
}
2. (10分)编写一个非递归算法的函数求出二叉排序树中的关键字最小的元素(注意异常情况的处理)。数据结构如下所示:
typede f int ElemType;
typedef struct node{
Elem Type data;
struct node*left, *right;
}BTreeNode;
请据此填写以下函数(提示:二叉排序树中的位置信息对应于关键字大小信息):
ElemType FindMax(BTreeNode *BST)
{
BTreeNode*t;
if(________){
printf(“不能在空树上查找最小值! \n”);
return;
}
________;
while(t->left!=NULL)
________;
return ________;
}
3. (10分)利用图的深度优先搜索写一个算法,判别以邻接表方式表示的有向图中是否存在由顶点vᵢ到顶点vⱼ的路径(i≠j)。
#define N 8
typede f struct node
{
int adjvex;
struct node*next;
}edgenode;
typedef struct
{
char vertex;
edgeno de *link;
}vexnode;
int visited[N];
int exist path DFS(vexnode ga[], int i, int j)
/*以邻接表为存储结构,判断vᵢ和vⱼ之间是否有路径,若有返回1, 否则返回0*/
{
edgenode *p;
if(________) return 1;
else
{
visited[i]=1; /*标记 v₁已被访问*/
________; /*访问vᵢ的第 个邻接点*/
while(________)/*依次访问v₂的邻接点*/
{
if(________&&________) /*v₁ 的邻接点若未被访问过,且该邻接点到vⱼ存在路径*/
return 1;
p=p->next;
}
}
return 0;
}
答案
一、 单项选择题
1-5 |
6-10 |
11-15 |
B、A、C、 B、B |
C、A、C、 A、A |
D、B、D、 C、B |
二、判断题
1-5 |
6-10 |
11-15 |
×、×、 ✔、✔、✔ |
✔、×、 ×、✔、× |
×、×、 ✔、✔、✔ |
三、填空题
1.顺序存储 链式存储
2.相邻
3. n->prior=m
4. bc
5.长度
6.2n-1
7. p->1child==NULL&&p->rchild==NULL
8.3
9.5
10.开放地址法 拉链法
11.2e
12. n(n-1)
13. d/2
14. nlog₂n
15. n-1
四、问题求解题
1.
( 2 ) WPL=45X 1+(12+13+16) X 3+(5+9)X=224
2.
前:ABDEC
中:DBEAC
后:DEBCA
3.
add |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
key |
78 |
|
15 |
03 |
|
57 |
45 |
20 |
31 |
|
23 |
36 |
12 |
次数 |
|
|
1 |
1 |
|
1 |
1 |
1 |
4 |
|
1 |
2 |
1 |
ASL成功=1+1+1+1+1+1+4+1+2+1=1.4
4.
(1)邻接矩阵
邻接表
(2) 2135 4
(3) 队列
5.
(1) 有向图
(2)
步骤 |
最短路径点集 |
选择的顶点 |
|
|
源点到各顶点的长度 |
|
|
|
初始 |
{0} |
一 |
D[0] |
D[1] |
D[2] |
D[3] |
D[4] |
D[5] |
第一步 |
{0,2} |
2 |
0 |
|
10 |
∞ |
30 |
100 |
第二步 |
{0,2,4} |
4 |
0 |
∞ |
10 |
60 |
30 |
100 |
第三步 |
{0,2,4,3} |
3 |
0 |
∞ |
10 |
50 |
30 |
90 |
第四步 |
{0,2,4,3,5} |
5 |
0 |
∞ |
10 |
50 |
30 |
60 |
第五步 |
{0,2,4,3,5,1} |
1 |
0 |
00 。 |
10 |
50 |
30 |
60 |
6、(1) 首先计算每种物品的单位重量的价值 vi/wi,将尽可能多的单位重量价值高的物品装入背包 。若将这种物品全部装入背包后 ,背包内的物品总重量未超过 c,则选择单位重量次高的物品并 尽可能多的装入背包 , 以此类推,直到背包装满为止 。算法描述:
void Knapsack(int n, float M, float v[], float w[], float x[]) {
//此函数可以直接使用已经排序好的v[]和w[]数组;
//n为物品数: M为背包大小; v为物品价值数组; w为物品重量数组; x为占比数组;
Sort(n, v, w);
int i;
for (i = 0; i < n; i++)
x[i] = 0; //将每件物品装进去背包的部分与总体的占比置零, 最大为1
float c = M;
for (i = 0; í < n; i++) {
if (w[i] > c) break; //若背包装不下, 则跳出循环
x[i] = 1; c -= w[i];
}
if (i < n) x[i] = c / w[i]; //若背包没有达到全部装进去的目的, 则装入部分}
(2) 5 公斤大米, 10 公斤面粉, 10公斤土豆
五、算法题
1.
void delete(LinkList *head, int max, int min){
LinkList *p, *q;
q = head;
p = head->next;
while (p != NULL) {
if ((p->data <= min) |] (p->data >= max)){
q = p;
p = p->next;
}
else {
q->next = p->next;
free(p);
p = q->next;
}
}
2.
BST == NULL
t = BST
t = t->left
t->data
3.
i==j
p = ga[i]->link
p != NULL
visited[p->adjvex] ==0 && exist path DFS (ga,p- ->adjvex, j) == 1