2009数据结构真题
1,为解决计算机与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是
A. 栈 B. 队列 C. 树 D. 图
解答: B 先入先出,满足队列特性
2. 设栈S 和队列Q 的初始状态均为空,元素abcdefg 依次进入栈S 。若每个元素出栈后立即进入队列Q ,且7个元素出队的顺序是bdcfeag ,则栈S 的容量至少是
A .1 B.2 C.3 D.4
解答: C 出队列的顺序即为出栈的顺序
3. 给定二叉树图所示。设N 代表二叉树的根,L 代表根结点的左子树,R 代表根结点的右子树。若遍历后的结点序列为3,1,7,5,6,2,4,则其遍历方式是
A .LRN B.NRL C.RLN D.RNL
解答: D 根据遍历后的结点序列,可知先右子树,后根结点,再左子树
4. 下列二叉排序树中,满足平衡二叉树定义的是
A .
B. C. D. 解答: B 见平衡二叉树的定义
5. 已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则完全二叉树的结点个数最多是
A .39 B.52 C.111 D.119
解答: C 最多的情况是:该完全二叉树共有7层,第6层上有8个叶子结点(即没有孩子结点). 因此,该7层的完全二叉树与7层的满二叉树相差8 * 2 = 16个结点。所以该7层完全二叉树结点个数为:27-1-16=111
6. 将森林转换为对应的二叉树,若在二叉树中,结点u 是结点v 的父结点的父结点,则在原来的森林中,u 和v 可能具有的关系是
I .父子关系
II. 兄弟关系
III. u的父结点与v 的父结点是兄弟关系
A. 只有II B.I 和II C.I 和III D.I 、II 和III
解答: B
7. 下列关于无向连通图特性的叙述中,正确的是
I .所有顶点的度之和为偶数
II. 边数大于顶点个数减1
III. 至少有一个顶点的度为1
A. 只有I B. 只有II C.I 和II D.I和III
解答: A II 和III 都可以用环型图来排除
8. 下列叙述中,不符合m 阶B 树定义要求的是
A .根节点最多有m 棵子树 B. 所有叶结点都在同一层上
C .各结点内关键字均升序或降序排列 D. 叶结点之间通过指针链接 解答: D 见B 树定义
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
解答: A 见小根堆插入算法
10. 若数据元素序列11,12,13,7,8,9,23,4,5是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是
A .起泡排序 B. 插入排序 C. 选择排序 D. 二路归并排序 解答: B
41. 带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假定从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法:
①设最短路径初始时仅包含初始顶点,令当前顶点u 为初始顶点;
②选择离u 最近且尚未在最短路径中的一个顶点v ,加入到最短路径中,修改当前顶点u=v;
③重复步骤②,直到u 是目标顶点时为止。
请问上述方法能否求得最短路径?若该方法可行,请证明之;否则,请举例说明。
解析:该方法求得的路径不一定是最短路径。例如,对于下图所示的带权图,如果按照题中的原则,从A 到C 的最短路径为A →B →C ,事实上其最短路径为 A →D →C 。
42. (15分)已知一个带有表头结点的单链表,结点结构为
假设该链表只给出了头指针list 。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k 个位置上的结点(k 为正整数)。若查找成功,算法输出该结点的data 值,并返回1;否则,只返回0。要求:
(1) 描述算法的基本设计思想
(2) 描述算法的详细实现步骤
(3) 根据设计思想和实现步骤,采用程序设计语言描述算法(使用C 或
C++或JA V A 语言实现),关键之处请给出简要注释。
解析:1)由于只知道链表头指针,因此只能顺序遍历链表。但需要访问倒数第k个位置上结点,即“先入后出”,因此可采用栈作为辅助存储结构
2),实现步骤如下:
1,遍历链表,将结点指针进栈,并统计链表中结点总个数total
2,如果total
3,出栈k-1次,栈项位置结点即为所求,输出其data 域,并返回1
3)C++语言描述如下:
#include
#include
using namespace std;
int LocateElement(Linklist& list,int k)
{
stack S;
LNode* p, *q;
p = list->link;
int count = 0;
while (p != NULL) //进栈,并统计链表中元素个数 { count++; S.push(p); p = p->link; }
} if (count data
2009数据结构真题
1,为解决计算机与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是
A. 栈 B. 队列 C. 树 D. 图
解答: B 先入先出,满足队列特性
2. 设栈S 和队列Q 的初始状态均为空,元素abcdefg 依次进入栈S 。若每个元素出栈后立即进入队列Q ,且7个元素出队的顺序是bdcfeag ,则栈S 的容量至少是
A .1 B.2 C.3 D.4
解答: C 出队列的顺序即为出栈的顺序
3. 给定二叉树图所示。设N 代表二叉树的根,L 代表根结点的左子树,R 代表根结点的右子树。若遍历后的结点序列为3,1,7,5,6,2,4,则其遍历方式是
A .LRN B.NRL C.RLN D.RNL
解答: D 根据遍历后的结点序列,可知先右子树,后根结点,再左子树
4. 下列二叉排序树中,满足平衡二叉树定义的是
A .
B. C. D. 解答: B 见平衡二叉树的定义
5. 已知一棵完全二叉树的第6层(设根为第1层)有8个叶结点,则完全二叉树的结点个数最多是
A .39 B.52 C.111 D.119
解答: C 最多的情况是:该完全二叉树共有7层,第6层上有8个叶子结点(即没有孩子结点). 因此,该7层的完全二叉树与7层的满二叉树相差8 * 2 = 16个结点。所以该7层完全二叉树结点个数为:27-1-16=111
6. 将森林转换为对应的二叉树,若在二叉树中,结点u 是结点v 的父结点的父结点,则在原来的森林中,u 和v 可能具有的关系是
I .父子关系
II. 兄弟关系
III. u的父结点与v 的父结点是兄弟关系
A. 只有II B.I 和II C.I 和III D.I 、II 和III
解答: B
7. 下列关于无向连通图特性的叙述中,正确的是
I .所有顶点的度之和为偶数
II. 边数大于顶点个数减1
III. 至少有一个顶点的度为1
A. 只有I B. 只有II C.I 和II D.I和III
解答: A II 和III 都可以用环型图来排除
8. 下列叙述中,不符合m 阶B 树定义要求的是
A .根节点最多有m 棵子树 B. 所有叶结点都在同一层上
C .各结点内关键字均升序或降序排列 D. 叶结点之间通过指针链接 解答: D 见B 树定义
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
解答: A 见小根堆插入算法
10. 若数据元素序列11,12,13,7,8,9,23,4,5是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是
A .起泡排序 B. 插入排序 C. 选择排序 D. 二路归并排序 解答: B
41. 带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假定从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法:
①设最短路径初始时仅包含初始顶点,令当前顶点u 为初始顶点;
②选择离u 最近且尚未在最短路径中的一个顶点v ,加入到最短路径中,修改当前顶点u=v;
③重复步骤②,直到u 是目标顶点时为止。
请问上述方法能否求得最短路径?若该方法可行,请证明之;否则,请举例说明。
解析:该方法求得的路径不一定是最短路径。例如,对于下图所示的带权图,如果按照题中的原则,从A 到C 的最短路径为A →B →C ,事实上其最短路径为 A →D →C 。
42. (15分)已知一个带有表头结点的单链表,结点结构为
假设该链表只给出了头指针list 。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k 个位置上的结点(k 为正整数)。若查找成功,算法输出该结点的data 值,并返回1;否则,只返回0。要求:
(1) 描述算法的基本设计思想
(2) 描述算法的详细实现步骤
(3) 根据设计思想和实现步骤,采用程序设计语言描述算法(使用C 或
C++或JA V A 语言实现),关键之处请给出简要注释。
解析:1)由于只知道链表头指针,因此只能顺序遍历链表。但需要访问倒数第k个位置上结点,即“先入后出”,因此可采用栈作为辅助存储结构
2),实现步骤如下:
1,遍历链表,将结点指针进栈,并统计链表中结点总个数total
2,如果total
3,出栈k-1次,栈项位置结点即为所求,输出其data 域,并返回1
3)C++语言描述如下:
#include
#include
using namespace std;
int LocateElement(Linklist& list,int k)
{
stack S;
LNode* p, *q;
p = list->link;
int count = 0;
while (p != NULL) //进栈,并统计链表中元素个数 { count++; S.push(p); p = p->link; }
} if (count data