2009、2010考研试题及解答(数据结构部分)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⑴ 描述算法的基本设计思想;
⑵ 描述算法的详细实现步骤;
⑶ 根据设计思想和实现步骤,采用程序设计语言描 述算法(使用C或C++或JAVA语言实现),关键之 处请给出简要注释。
2020/8/5
25
算法思想:设指针q指向链表,指针p指向链表第一元素, q是p的前驱(广义)。p向后移动k个结点后,p和q相 距k。之后同步移动指针p和q,到p=null时,q指向倒数 第k个结点。另一算法是链表结点入栈,弹出第k个结 点,不如前者性能好。
A. 栈
B. 队列
C. 树
D. 图
2020/8/5
2
2. 设栈S和队列Q的初始状态均为空,元素 a,b,c,d,e,f,g依次进入栈S。若每个元素出栈后立 即进入队列Q,且7个元素出队的顺序是 b,d,c,f,e,a,g,则栈S的容量至少是( )
A. 1
B. 2
C. 3
D. 4
2020/8/5
2020/8/5
5
5. 已知一棵完全二叉树的第6层(设根是 第1层)有8个叶结点,则该完全二叉树的 结点个数最多是( )
A. 39
B. 52
C. 111
D. 119
2020/8/5
6
6. 将森林转换为对应的二叉树,若在二叉 树中,结点u是结点v的父结点的父结点, 则在原来的森林中,u和v可能具有的关系 是( ) Ⅰ. 父子关系 Ⅱ. 兄弟关系 Ⅲ. u的父结点与v的父结点是兄弟关系
2020/8/5
29
42、( 13 分)设将n(n>1)个整数存放到一维数组R 中。试设计一个在时间和空间两方面都尽可能高效的算 法,将R中保存的序列循环左移P(0<P<n)个位置,即 将R中的数据由(X0,X1,…,Xn-1)变换为 (XP,Xp+1,…,Xn-1,X0,X1,…,Xp-1)。要求:
8
9. 已知关键字序列5,8,12,19,28,20,15, 22是小根堆(最小堆),插入关键字3,调整 后得到的小根堆是( )
A. 3,5,12,8,28,20,15,22,19
B. 3,5,12,19,20,15,22,8,28
C. 3,8,12,5,20,15,22,28,19
D. 3,12,5,8,28,20,15,22,19
2020/8/5
9
10. 若数据元素序列11,12,13,7,8,9,23,4,5是采 用下列排序方法之一得到的第二趟排序后 的结果,则该排序算法只能是( )
A. 起泡排序
B. 插入排序
C. 选择排序
D. 二路归并排序
2020/8/5
10
1.若元素a,b,c,d,e,f依次进栈, 允许进栈、退栈操作交替进行,但不允许 连续三次进行退栈操作,则不可能得到的 出栈序列是( )
2020/8/5
21
二、综合应用题:41-47小题,共70分。 请将答案写在答题纸指定位置上。
2020/8/5
22
41. (10分)带权图(权值非负,表示边连接的两 顶点间的距离)的最短路径问题是找出从初始顶 点到目标顶点之间的一条最短路径,假设从初始 顶点到目标顶点之间存在路径,现有一种解决该 问题的方法:
i = 0; while(i < n-p) { pR[i] = pR[p+i]; i++; } //将R中从第p个整 数开始的整数前移p个位置。
① 设最短路径初始时仅包含初始顶点,令当前 顶点u为初始顶点;
② 选择离u最近且尚未在最短路径中的一个顶点v, 加入到最短路径中,修改当前顶点u=v;
③重复步骤②,直到u是目标顶点时为止。 请问上述方法能否求得最短路径?若该方法可行,
请证明之;否则,请举例说明。
2020/8/5
23
上述方法不能求得最短路径。离u最近未 必离初始顶点最近。例如,下图求v0到v1 的最短路径,按题目所给方法得45(v0v2-v3-v1),并非最短路径。详细证明请参 照Dijkstra或Floyd算法。
(2) void leftshift(int R[], int p, int n) { elemtype t; //t和数组R中的元素具有相同类型
for(i=0;i<p/2;i++) //逆置0..p-1段
{t=R[i]; R[i]=R[p-1-i];R[p-1-i]=t;} for(i=p;i<(n+p)/2;i++) //逆置p..n-1段
15
6. 对n(n≥2)个权值均不相同的字符构造哈夫曼 树。下列关于该哈夫曼树的叙述中,错误的是 ()
A. 该树一定是一棵完全二叉树
B. 树中一定没有度为1 的结点
C. 树中两个权值最小的结点一定是兄弟结点
D. 树中任一非叶结点的权值一定不小于下一层任 一结点的权值
2020/8/5
16
7.若无向图G=(V,E)中含有7个顶点,要 保证图G在任何情况下都是连通的,则需要 的边数最少是( )
(1)给出算法的基本设计思想。 (2)根据设计思想,采用C 或C++或JAVA 语言描述算
法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
2020/8/5
30
解法一: (1)算法设计思想:按照下标0到p-1、p到n-1、0到n-1的顺序,将
这三段分别逆置,最后的结果即为所求。
2020/8/5
32
(2)使用c语言描述算法如下:
void Shift(int *pR, int n, int p) //pR是指向数组R的指针,n为存放的整数个数, //p为循环左移的个数
{ int temp[p]; // 辅助数组,存放要移出的整数。
int i=0; while(i<p) { temp[i] = pR[i]; i++; } //将R中前p个数据存 入辅助数组中。
A. 13、48 B. 24、48 C. 24、53 D. 24、90
2020/8/5
14
5.在一棵度为4的树T中,若有20个度为4的结 点,10个度为3的结点,1个度为2的结点,10 个度为1的结点,则树T的叶结点个数是
A. 41
B. 82
C. 113
D. 122
2020/8/5
(1)请画出所构造的散列表。
(2)分别计算等概率情况下查找成功和查找不成 功的平均查找长度。
2020/8/5
27
α 表中的记录数/散列表长度
由装填因子为0.7,表中记录数为7个,可知散列表长 度为10
散列函数为:H(key)=(key x 3)MOD 7 线性探测再散列函数为: (H(key)+di) MOD 10 其中:di=(1,2,3……9) 所构造散列表如下:
一、单项选择题:1~40小题,每小题 2分,共80分。下列每题给出的四个 选项中,只有一个选项是最符合题目 要求的。请在答题卡上将所选项的字 母涂黑。
2020/8/5
1
1. 为解决计算机主机与打印机之间速度不 匹配问题,通常设置一个打印数据缓冲区, 主机将要输出的数据依次写入该缓冲区, 而打印机则依次从该缓冲区中取出数据。 该缓冲区的逻辑结构应该是( )
A. 4 B. 5 C. 6 D. 7
2020/8/5
19
10.采用递归方式对顺序表进行快速排序。下列 关于递归次数的叙述中,正确的是( )
A. 递归次数与初始数据的排列次序无关
B. 每次划分后,先处理较长的分区可以减少递 归次数
C. 每次划分后,先处理较短的分区可以减少递 归次数
D. 递归次数与每次划分后得到的分区的处理顺 序无关Βιβλιοθήκη Baidu
2020/8/5
20
11.对一组数据(2,12,16,88,5,10)进行 排序,若前三趟排序结果如下:
第一趟排序结果:2,12,16,5,10,88 第二趟排序结果:2,12,5,10,16,88 第三趟排序结果:2,5,10,12,16,88 则采用的排序方法可能是 A. 起泡排序 B. 希尔排序 C. 归并排序 D. 基数排序
A. b,a,c,d,e B. d,b,a,c,e C. d,b,c,a,e D. e,c,b,a,d
2020/8/5
12
3.下列线索二叉树中(用虚线表示线索), 符合后序线索树定义的是( )
2020/8/5
13
4. 在下图所示的平衡二叉树中,插入关键字 48后得到一棵新平衡二叉树。在新平衡二叉 树中,关键字37所在结点的左、右子结点中 保存的关键字分别是( )
3
3. 给定二叉树如下图所示。设N代表二叉树 的根,L代表根结点的左子树,R代表根结 点的右子树。若遍历后的结点序列为 3,1,7,5,6,2,4,则其遍历方式是( )
A. LRN
B. NRL
C. RLN
D. RNL
2020/8/5
4
4. 下列二叉排序树中,满足平衡二叉 树定义的是( )
2020/8/5
24
42.(15分)已知一个带有表头结点的单链表,结点 结构为(data,link),假设该链表只给出了头指针list。 在不改变链表的前提下,请设计一个尽可能高效的 算法,查找链表中倒数第k个位置上的结点(k为正 整数),若查找成功,算法输出该结点的data域的 值,并返回1;否则,只返回0,要求:
A. 只有Ⅱ B. Ⅰ和Ⅱ C. Ⅰ和Ⅲ D. Ⅰ、Ⅱ和Ⅲ
2020/8/5
7
7. 下列关于无向连通图特性的叙述中,正 确的是( )
Ⅰ. 所有顶点的度之和为偶数 Ⅱ. 边数大于顶点个数减1 Ⅲ. 至少有一个顶点的度为1 A. 只有Ⅰ B. 只有Ⅱ C. Ⅰ和Ⅱ D. Ⅰ和Ⅲ
2020/8/5
讨论:若采用直接左移p位,空间复杂度仍为O(1),但时间复杂 度为O(np)。
2020/8/5
31
解法二:
(1)建立一个可以放下p个整数的辅助队列,将 数组R中的前p个整数依次进入辅助队列,将R中 后面的n-p个整数依次前移p个位置,将辅助队列 中的数据依次出队,依次放入R中第n-p个整数开 始的位置。
while(p) {q=q->link; p=p->link; } //向链表尾同步移动指 针p和q
return 1;
//q指向倒数第k个结点
2020/8/5
26
41.( 10 分)将关键字序列(7,8,30,11,18,9,14) 散列存储到散列表中,散列表的存储空间是一个下 标从0开始的一维数组,散列函数为:H(key) =(key×3) MOD 7,处理冲突采用线性探测再散列 法,要求装填(载)因子为0.7。
{t=R[i]; R[i]=R[n-1-i+p];R[n-1-i+p]=t;} for(i=0;i<n/2;i++) //逆置0..n-1段,即整个数组逆置
{t=R[i]; R[i]=R[n-1-i];R[n-1-i]=t;} }//算法初始调用:leftshift(R,p,n),各参数意义如上。
(3)算法执行了两趟逆置,时间复杂度为O(n);用了一个辅助变量 空间,空间复杂度为O(1)。
算法的主要语句段如下:
p=list->link; //p指向当前待处理元素
q=list;
//若成功,q指向倒数第k个元素
i=1;
while(p && i<k) {i++; p=p->link; } //指针p指向链表第k个 结点
if(p==null) {printf(“不存在\n”); return 0; }//所给k太大
A. d,c,e,b,f,a B. c,b,d,a,e,f C. b,c,a,e,f,d D. a,f,e,d,c,b
2020/8/5
11
2.某队列允许在其两端进行入队操作,但 仅允许在一端进行出队操作。若元素a,b, c,d,e依次入此队列后再进行出队操作, 则不可能得到的出队序列是( )
A. 6
B. 15
C. 16
D. 21
2020/8/5
17
8.对下图进行拓扑排序,可以得到不同 拓扑序列的个数是( )
A. 4
B. 3 C. 2 D. 1
e
d a
b
c
2020/8/5
18
9.已知一个长度为16的顺序表L,其元素 按关键字有序排列。若采用折半查找法查 找一个L中不存在的元素,则关键字的比 较次数最多是( )
0 12 3 4 56 7 8 9
7 14
8
11 30 18 9
12
1
1133
2020/8/5
28
0 12 3 4 56 7 8 9
7 14
8
11 30 18 9
12
1
1133
ASLSS=1/7(4*1+2*1+2*3)=12/7=1.71
ASLUN=1/10(3+2+1+2+1+5+4+3+2+1)= 2.4
⑵ 描述算法的详细实现步骤;
⑶ 根据设计思想和实现步骤,采用程序设计语言描 述算法(使用C或C++或JAVA语言实现),关键之 处请给出简要注释。
2020/8/5
25
算法思想:设指针q指向链表,指针p指向链表第一元素, q是p的前驱(广义)。p向后移动k个结点后,p和q相 距k。之后同步移动指针p和q,到p=null时,q指向倒数 第k个结点。另一算法是链表结点入栈,弹出第k个结 点,不如前者性能好。
A. 栈
B. 队列
C. 树
D. 图
2020/8/5
2
2. 设栈S和队列Q的初始状态均为空,元素 a,b,c,d,e,f,g依次进入栈S。若每个元素出栈后立 即进入队列Q,且7个元素出队的顺序是 b,d,c,f,e,a,g,则栈S的容量至少是( )
A. 1
B. 2
C. 3
D. 4
2020/8/5
2020/8/5
5
5. 已知一棵完全二叉树的第6层(设根是 第1层)有8个叶结点,则该完全二叉树的 结点个数最多是( )
A. 39
B. 52
C. 111
D. 119
2020/8/5
6
6. 将森林转换为对应的二叉树,若在二叉 树中,结点u是结点v的父结点的父结点, 则在原来的森林中,u和v可能具有的关系 是( ) Ⅰ. 父子关系 Ⅱ. 兄弟关系 Ⅲ. u的父结点与v的父结点是兄弟关系
2020/8/5
29
42、( 13 分)设将n(n>1)个整数存放到一维数组R 中。试设计一个在时间和空间两方面都尽可能高效的算 法,将R中保存的序列循环左移P(0<P<n)个位置,即 将R中的数据由(X0,X1,…,Xn-1)变换为 (XP,Xp+1,…,Xn-1,X0,X1,…,Xp-1)。要求:
8
9. 已知关键字序列5,8,12,19,28,20,15, 22是小根堆(最小堆),插入关键字3,调整 后得到的小根堆是( )
A. 3,5,12,8,28,20,15,22,19
B. 3,5,12,19,20,15,22,8,28
C. 3,8,12,5,20,15,22,28,19
D. 3,12,5,8,28,20,15,22,19
2020/8/5
9
10. 若数据元素序列11,12,13,7,8,9,23,4,5是采 用下列排序方法之一得到的第二趟排序后 的结果,则该排序算法只能是( )
A. 起泡排序
B. 插入排序
C. 选择排序
D. 二路归并排序
2020/8/5
10
1.若元素a,b,c,d,e,f依次进栈, 允许进栈、退栈操作交替进行,但不允许 连续三次进行退栈操作,则不可能得到的 出栈序列是( )
2020/8/5
21
二、综合应用题:41-47小题,共70分。 请将答案写在答题纸指定位置上。
2020/8/5
22
41. (10分)带权图(权值非负,表示边连接的两 顶点间的距离)的最短路径问题是找出从初始顶 点到目标顶点之间的一条最短路径,假设从初始 顶点到目标顶点之间存在路径,现有一种解决该 问题的方法:
i = 0; while(i < n-p) { pR[i] = pR[p+i]; i++; } //将R中从第p个整 数开始的整数前移p个位置。
① 设最短路径初始时仅包含初始顶点,令当前 顶点u为初始顶点;
② 选择离u最近且尚未在最短路径中的一个顶点v, 加入到最短路径中,修改当前顶点u=v;
③重复步骤②,直到u是目标顶点时为止。 请问上述方法能否求得最短路径?若该方法可行,
请证明之;否则,请举例说明。
2020/8/5
23
上述方法不能求得最短路径。离u最近未 必离初始顶点最近。例如,下图求v0到v1 的最短路径,按题目所给方法得45(v0v2-v3-v1),并非最短路径。详细证明请参 照Dijkstra或Floyd算法。
(2) void leftshift(int R[], int p, int n) { elemtype t; //t和数组R中的元素具有相同类型
for(i=0;i<p/2;i++) //逆置0..p-1段
{t=R[i]; R[i]=R[p-1-i];R[p-1-i]=t;} for(i=p;i<(n+p)/2;i++) //逆置p..n-1段
15
6. 对n(n≥2)个权值均不相同的字符构造哈夫曼 树。下列关于该哈夫曼树的叙述中,错误的是 ()
A. 该树一定是一棵完全二叉树
B. 树中一定没有度为1 的结点
C. 树中两个权值最小的结点一定是兄弟结点
D. 树中任一非叶结点的权值一定不小于下一层任 一结点的权值
2020/8/5
16
7.若无向图G=(V,E)中含有7个顶点,要 保证图G在任何情况下都是连通的,则需要 的边数最少是( )
(1)给出算法的基本设计思想。 (2)根据设计思想,采用C 或C++或JAVA 语言描述算
法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
2020/8/5
30
解法一: (1)算法设计思想:按照下标0到p-1、p到n-1、0到n-1的顺序,将
这三段分别逆置,最后的结果即为所求。
2020/8/5
32
(2)使用c语言描述算法如下:
void Shift(int *pR, int n, int p) //pR是指向数组R的指针,n为存放的整数个数, //p为循环左移的个数
{ int temp[p]; // 辅助数组,存放要移出的整数。
int i=0; while(i<p) { temp[i] = pR[i]; i++; } //将R中前p个数据存 入辅助数组中。
A. 13、48 B. 24、48 C. 24、53 D. 24、90
2020/8/5
14
5.在一棵度为4的树T中,若有20个度为4的结 点,10个度为3的结点,1个度为2的结点,10 个度为1的结点,则树T的叶结点个数是
A. 41
B. 82
C. 113
D. 122
2020/8/5
(1)请画出所构造的散列表。
(2)分别计算等概率情况下查找成功和查找不成 功的平均查找长度。
2020/8/5
27
α 表中的记录数/散列表长度
由装填因子为0.7,表中记录数为7个,可知散列表长 度为10
散列函数为:H(key)=(key x 3)MOD 7 线性探测再散列函数为: (H(key)+di) MOD 10 其中:di=(1,2,3……9) 所构造散列表如下:
一、单项选择题:1~40小题,每小题 2分,共80分。下列每题给出的四个 选项中,只有一个选项是最符合题目 要求的。请在答题卡上将所选项的字 母涂黑。
2020/8/5
1
1. 为解决计算机主机与打印机之间速度不 匹配问题,通常设置一个打印数据缓冲区, 主机将要输出的数据依次写入该缓冲区, 而打印机则依次从该缓冲区中取出数据。 该缓冲区的逻辑结构应该是( )
A. 4 B. 5 C. 6 D. 7
2020/8/5
19
10.采用递归方式对顺序表进行快速排序。下列 关于递归次数的叙述中,正确的是( )
A. 递归次数与初始数据的排列次序无关
B. 每次划分后,先处理较长的分区可以减少递 归次数
C. 每次划分后,先处理较短的分区可以减少递 归次数
D. 递归次数与每次划分后得到的分区的处理顺 序无关Βιβλιοθήκη Baidu
2020/8/5
20
11.对一组数据(2,12,16,88,5,10)进行 排序,若前三趟排序结果如下:
第一趟排序结果:2,12,16,5,10,88 第二趟排序结果:2,12,5,10,16,88 第三趟排序结果:2,5,10,12,16,88 则采用的排序方法可能是 A. 起泡排序 B. 希尔排序 C. 归并排序 D. 基数排序
A. b,a,c,d,e B. d,b,a,c,e C. d,b,c,a,e D. e,c,b,a,d
2020/8/5
12
3.下列线索二叉树中(用虚线表示线索), 符合后序线索树定义的是( )
2020/8/5
13
4. 在下图所示的平衡二叉树中,插入关键字 48后得到一棵新平衡二叉树。在新平衡二叉 树中,关键字37所在结点的左、右子结点中 保存的关键字分别是( )
3
3. 给定二叉树如下图所示。设N代表二叉树 的根,L代表根结点的左子树,R代表根结 点的右子树。若遍历后的结点序列为 3,1,7,5,6,2,4,则其遍历方式是( )
A. LRN
B. NRL
C. RLN
D. RNL
2020/8/5
4
4. 下列二叉排序树中,满足平衡二叉 树定义的是( )
2020/8/5
24
42.(15分)已知一个带有表头结点的单链表,结点 结构为(data,link),假设该链表只给出了头指针list。 在不改变链表的前提下,请设计一个尽可能高效的 算法,查找链表中倒数第k个位置上的结点(k为正 整数),若查找成功,算法输出该结点的data域的 值,并返回1;否则,只返回0,要求:
A. 只有Ⅱ B. Ⅰ和Ⅱ C. Ⅰ和Ⅲ D. Ⅰ、Ⅱ和Ⅲ
2020/8/5
7
7. 下列关于无向连通图特性的叙述中,正 确的是( )
Ⅰ. 所有顶点的度之和为偶数 Ⅱ. 边数大于顶点个数减1 Ⅲ. 至少有一个顶点的度为1 A. 只有Ⅰ B. 只有Ⅱ C. Ⅰ和Ⅱ D. Ⅰ和Ⅲ
2020/8/5
讨论:若采用直接左移p位,空间复杂度仍为O(1),但时间复杂 度为O(np)。
2020/8/5
31
解法二:
(1)建立一个可以放下p个整数的辅助队列,将 数组R中的前p个整数依次进入辅助队列,将R中 后面的n-p个整数依次前移p个位置,将辅助队列 中的数据依次出队,依次放入R中第n-p个整数开 始的位置。
while(p) {q=q->link; p=p->link; } //向链表尾同步移动指 针p和q
return 1;
//q指向倒数第k个结点
2020/8/5
26
41.( 10 分)将关键字序列(7,8,30,11,18,9,14) 散列存储到散列表中,散列表的存储空间是一个下 标从0开始的一维数组,散列函数为:H(key) =(key×3) MOD 7,处理冲突采用线性探测再散列 法,要求装填(载)因子为0.7。
{t=R[i]; R[i]=R[n-1-i+p];R[n-1-i+p]=t;} for(i=0;i<n/2;i++) //逆置0..n-1段,即整个数组逆置
{t=R[i]; R[i]=R[n-1-i];R[n-1-i]=t;} }//算法初始调用:leftshift(R,p,n),各参数意义如上。
(3)算法执行了两趟逆置,时间复杂度为O(n);用了一个辅助变量 空间,空间复杂度为O(1)。
算法的主要语句段如下:
p=list->link; //p指向当前待处理元素
q=list;
//若成功,q指向倒数第k个元素
i=1;
while(p && i<k) {i++; p=p->link; } //指针p指向链表第k个 结点
if(p==null) {printf(“不存在\n”); return 0; }//所给k太大
A. d,c,e,b,f,a B. c,b,d,a,e,f C. b,c,a,e,f,d D. a,f,e,d,c,b
2020/8/5
11
2.某队列允许在其两端进行入队操作,但 仅允许在一端进行出队操作。若元素a,b, c,d,e依次入此队列后再进行出队操作, 则不可能得到的出队序列是( )
A. 6
B. 15
C. 16
D. 21
2020/8/5
17
8.对下图进行拓扑排序,可以得到不同 拓扑序列的个数是( )
A. 4
B. 3 C. 2 D. 1
e
d a
b
c
2020/8/5
18
9.已知一个长度为16的顺序表L,其元素 按关键字有序排列。若采用折半查找法查 找一个L中不存在的元素,则关键字的比 较次数最多是( )
0 12 3 4 56 7 8 9
7 14
8
11 30 18 9
12
1
1133
2020/8/5
28
0 12 3 4 56 7 8 9
7 14
8
11 30 18 9
12
1
1133
ASLSS=1/7(4*1+2*1+2*3)=12/7=1.71
ASLUN=1/10(3+2+1+2+1+5+4+3+2+1)= 2.4