全国硕士研究生入学统一考试-数据结构习题集 下载本文

Houjiuming

2009年全国硕士研究生入学统一考试

计算机科学与技术学科联考 计算机学科专业基础综合

考试大纲 教育部考试中心

中国学位与研究生教育学会工科工作委员会

目 录

I. 考查目标

II. 考试形式和试卷结构考查范围 III. 考查范围

数据结构 计算机组成原理 操作系统 计算机网络 IV.

试题示例

Ⅰ.考查目标

计算机学科专业基础综合考试涵盖数据机构、计算机组成原理、操作系统和计算机网络等学科专业基础课程。要求考生比较系统地掌握上述专业基础课程的概念、基本原理和方法,能够运用所学的基本原理和基本方法分析、判断和解决有关理论问题和实际问题。

Ⅱ.考试形式和试卷结构

一、试卷满分及考试时间

本试卷满分为150分,考试时间为180分钟 二、答题方式 答题方式为闭卷、笔试 三、试卷内容结构 数据结构 45分

- 1 -

计算机组成原理 45分 操作系统 35分 计算机网络 25分 四、试卷题型结构

单项选择题 80分(40小题,每小题2分) 综合应用题 70分

2009年全国硕士研究生入学统一考试

Ⅲ.考查范围

数据结构

【考查目标】

1.理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。

2.掌握基本的数据处理原理和方法的基础上,能够对算法进行设计与分析。 3.能够选择合适的数据结构和方法进行问题求解。

一、线性表

(一)线性表的定义和基本操作 (二)线性表的实现 1.顺序存储结构 2.链式存储结构 3.线性表的应用

二、栈、队列和数组 (一)栈和队列的基本概念 (二)栈和队列的顺序存储结构 (三)栈和队列的链式存储结构 (四)栈和队列的应用 (五)特殊矩阵的压缩存储

- 2 -

三、树与二叉树 (一)树的概念 (二)二叉树

1.二叉树的定义及其主要特征

2.二叉树的顺序存储结构和链式存储结构 3.二叉树的遍历

4.线索二叉树的基本概念和构造 5.二叉排序树 6.平衡二叉树 (三)树、森林 1.书的存储结构 2.森林与二叉树的转换 3.树和森林的遍历 (四)树的应用 1.等价类问题

2.哈夫曼(Huffman)树和哈夫曼编码

四、 图 (一) 图的概念

(二) 图的存储及基本操作 1.邻接矩阵法 2.邻接表法 (三)图的遍历 1. 深度优先搜索 2. 广度优先搜索

(四)图的基本应用及其复杂度分析 1. 最小(代价)生成树 2. 最短路径 3. 拓扑排序

- 3 -

4. 关键路径 五、查找

(一)查找的基本概念 (二)顺序查找法 (三)折半查找法 (四) B-树

(五)散列(Hash)表及其查找 (六)查找算法的分析及应用

六、内部排序 (一)排序的基本概念 (二)插入排序 1.直接插入排序 2.折半插入排序

(三)气泡排序(bubble sort) (四)简单选择排序 (五)希尔排序(shell sort) (六)快速排序 (七)堆排序

(八)二路归并排序(merge sort) (九)基数排序

(十)各种内部排序算法的比较 (十一)内部排序算法的应用

Ⅳ.试题示例

一、单项选择题:1~40小题,每小题2分,共80分。在每小题给出的四个选项中, 请选出一项最符合题目要求的。 试题示例:

- 4 -

1、 下列排序算法中,时间复杂度为O(nlog2n)且占用额外空间最少的是 A.堆排序 C.快速排序

2、 下列序列中,满足堆定义的是

A.(100,86,48,73,35,39,42,57,66,21) B.(12,70,33,65,24,56,48,92,86,33) C.(103,97,56,38,66,23,42,12,30,52,6,26) D.(5,56,20,23,40,38,29,61,35,76,28,100)

二、综合应用题:41~47小题,共70分。 试题示例:

41.(10分)设无向图G=(V,E),其中V={1,2,3,4,5},E={(1,2,4),(2,5,5),(1,3,2),(2,4,4),(3,4,1),(4,5,3),(1,5,8)},每条边由一个三元组表示,三元组中前两个元素为与该边关联的顶点,第三个元素为该边的权。请写出图G中从顶点1到其余各点的了短路径的求解过程。要求列出最短路径上的顶点,并计算路径长度。

42.(15分)已知一棵二叉树采用二叉链表存储,结点构造为:

LeftChild Data RightChild ,root指向根结点。现定义二叉树中结点X0 的根路径为从根结点到X0 结点的一条路径,请编写算法输出该二叉树中最长的根路径(多条最长根路径中只输出一条即可。算法可使用C或C + +或JAVA语言实现)。

B.起泡排序 D.希尔排序

- 5 -

第 1 章 绪论

一、单选题

1、在数据结构中,从逻辑上可以把数据结构分成

A、动态结构和静态结构

B、紧凑结构和非紧凑结构 D、内部结构和外部结构

C、线性结构和非线性结构 2、算法分析的两个主要方面是

A、空间复杂性和时间复杂性 C、可读性和文档性

B、正确性和简明性

D、数据复杂性和程序复杂性

3、数据的不可分割的最小单位是

A、结点

B、数据元素

C、数据项

D、数据对象

4、在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为

A、规则

B、集合

C、结构

D、运算

5、与程序运行时间有关的因素主要有以下四方面,其中与算法关系密切的是

A、问题的规模

B、机器代码质量的优劣 D、语句的执行次数

C、机器执行速度 二、判断题

1、数据结构是带有结构的数据元素的集合。 2、程序越短,运行的时间就越少。 3、处理同一问题的算法是唯一的。

4、一个完整算法可以没有输入,但必须有输出。 三、填空题

1、______________是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。 2、______________结构的数据元素之间存在一对多的关系。

3、数据结构的形式化定义为 (D,S),其中 D 是______________的有限集,S 是 D 上关系的有限集。

4、数据结构在计算机中的______________称为存储结构。

5、数据元素之间的关系在计算机中有两种不同的表示方法:顺序映象和非顺序映象,由此

- 6 -

得到两种不同的存储结构是______________存储结构和______________存储结构。 6、一个算法具有五个特性:______________、______________、______________、有零个或多个输入、有一个或多个输出。

7、评价一个算法的好坏应该从算法的正确性、可读性、___________和_________________等几方面进行。 四、解答题

1、设n为正整数。试确定下列各程序段中前置以记号@的语句的频度: ⑴ i=1;

k=0; while (i<=n-1) {

@ k+=10*i; i++; } ⑵ i=1;

k=0; do {

@ k+=10*i; i++; } while (i<=n-1); ⑶ i=1;

k=0; while (i<=n-1) { i++; @ k+=10*i; } ⑷ k=0;

for (i=1;i<=n;i++) {

for (j=i;j<=n;j++) @ k++;

- 7 -

}

2、阅读以下算法: void fun(int n) {

int i,j,k,s,x; for (s=0,i=0;i

j=n; x=0; while (i

printf(\,x=%d\\n\,s,x); }

⑴分析算法中语句“s++;”的执行次数; ⑵分析算法中语句“x+=2;”的执行次数; ⑶分析算法的时间复杂度。

五、算法设计题

编程实现课本例1-7所描述的抽象数据类型Triplet,并完成以下功能,要求有菜单提示: ⑴初始化三元组为 (100,200,300); ⑵获取第二个元素值并输出; ⑶置第三个元素值为 150; ⑷获取第三个元素值并输出; ⑸获取最大元素值并输出; ⑹获取最小元素值并输出; ⑺撤销三元组。

- 8 -

第2章 线性表

一、单选题 1.线性表是( ) 。

(A) 一个有限序列,可以为空 (B) 一个有限序列,不能为空 (C) 一个无限序列,可以为空 (D) 一个无序序列,不能为空 2.线性表采用链式存储时,其地址( ) 。

(A) 必须是连续的 (B) 部分地址必须是连续的 (C) 一定是不连续的 (D) 连续与否均可以 3.与顺序表相比,用链表实现线性表的优点是( )。 (A)便于随机存取 (B)花费的存储空间较顺序存储少 (C)便于插入和删除 (D)数据元素的物理顺序与逻辑顺序相同 4.线性表的静态链表结构与顺序存储结构相比优点是( )。 (A)所有的操作算法实现简单 (B)便于随机存取 (C)便于插入和删除 (D)便于利用零散的存储器空间 5.循环链表的主要优点是( ) 。 (A)不在需要头指针了

(B)已知某个结点的位置后,能够容易找到他的直接前趋 (C)在进行插入、删除运算时,能更好的保证链表不断开 (D)从表中的任意结点出发都能扫描到整个链表 6.下面关于线性表的叙述错误的是( )。

(A) 线性表采用顺序存储,必须占用一片地址连续的单元 (B) 线性表采用顺序存储,便于进行插入和删除操作 (C) 线性表采用链式存储,不必占用一片地址连续的单元 (D) 线性表采用链式存储,不便于进行插入和删除操作; 7.假设双链表结点的类型如下: typedef struct linknode { int data ; //数据域

struct linknode *llink;//指向前趋结点的指针域 struct linknode *rlink;//指向后继结点的指针域

- 9 -

} bnode

现将一个q 所指新结点作为非空双向链表中的p 所指结点的前趋结点插入到该双链表中,能正确完成此要求的语句段是( )。

(A) q->rlink=p;q->llink=p->llink;p->llink=q;p->llink->rlink=q (B) p->llink=q;q->rlink=p;p->llink->rlink=q;q->llink=p->llink (C) q->llink=p->rlink;q->rlink=p;p->link->rlink=q;p->llink=q (D) 以上都不对

8. 一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是: (A)110 (B)108 (C)100 (D)120

9. 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( ) (A) 访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) (B) 在第i个结点后插入一个新结点(1≤i≤n) (C) 删除第i个结点(1≤i≤n) (D) 将n个结点从小到大排序 10. 链式存储结构所占存储空间( )

(A) 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 (B) 只有一部分,存放结点值

(C) 只有一部分,存储表示结点间关系的指针

(D) 分两部分,一部分存放结点值,另一部分存放结点所占单元数

11. 若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( )存储方式最节省运算时间。 (A) 单链表 (B) 仅有头指针的单循环链表 (C) 双链表 (D) 仅有尾指针的单循环链表

12. 将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( ) (A)n (B)2n-1 (C)2n (D)n-1

13. 线性表L在以下哪种情况下适用于使用链式结构实现( ) (A)需经常修改L中的结点值 (B)需不断对L进行删除插入 (C)L中含有大量的结点 (D)L中结点结构复杂

14.在一个单链表L中,若要删除由指针q所指向结点的后继结点,则执行( )。

- 10 -

(A) p=q->next; p->next=q->next (B) p=q->next; q->next=p (C) p=q->next; q->next; q->next=q (D) q->next=q=->next->next; q->next=q;

15. 在非空双向循环链表中,在由q所指的结点后面插入一个由p所指的结点的过程是依次执行:p->Llink=q,p->Rlink=q->Rlink,q->Rlink=p,( )。(括号中应该填上一条赋值语句) (A) q->Llink=p (B) q->Rlink->Llink=p (C) p->Rlink->Llink=p (D) p->Llink->Llink=p

二、判断题

1.线性表的逻辑顺序与存储顺序总是一致的。 2.顺序存储的线性表可以按序号随机存取。

3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。

4.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。 5.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。 6.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。 7.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。

8. 如果没有提供指针类型的语言,就无法构造链式结构。

9. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动将后续各个单元向前移动。

10. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 11. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 12. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 13. 在具有头结点的链式存储结构中,头指针指向链表中的第一个数据结点。 14. 一个循环链表可以由所给定的头指针或者尾指针唯一确定。 三、填空题

1.线性结构的基本特征是:若至少含有一个结点,则除起始结点没有直接______外,其他结

- 11 -

点有且仅有一个直接______;除终端结点没有直接______外,其它结点有且仅有一个直接______.

2.线性表的顺序存储结构通过________来直接反映数据元素之间的逻辑关系,而链式存储结构则通过_______间接反映数据元素之间的逻辑关系。

3.线性表的常见链式存储结构有________、________和________。

4.对于长度为n的非空线性表,插入或者删除一个数据元素的操作的时间复杂度为_______。 5.在一个单链表中指针p所指结点之后插入一个由指针s所指结点,应执行s->next=________;和p->next=_____________的操作。

6.在一个单链表中删除指针p所指结点(若存在),则需要修改指针的操作是_______。 7.对于一个长度为n的非空顺序表,删除它的第i个数据元素时,需要移动_____个其他数据元素。

8.在以H为头指针的带表头结点的单循环链表中,链表为空的条件为 。 9.在单链表中,每个结点包含有两个域,一个叫 域,另一个叫 域。

10.在下面数组a中存储着一个静态链表,表头指针为a[0].next,则该线性表为 。

a

0

1

2

3

4

5 6

7

8

data next 4 60 56 42 38 3 7 6 2 74 25 0 1 11.一元多项式f(x) =9x10-3x7+6x-5的单链表表示是____________。 四、解答题

1.何时选用顺序表、何时选用链表作为线性表的存储结构为宜? 2.简述带头结点和不带头结点的单链表的区别。

3.说明在顺序表中实现插入操作和删除操作时为什么必须移动数据元素,以及插入操作和删除操作各自移动数据元素的方向?

4.在单链表和双向链表中,能否从当前结点出发访问到任一结点? 5. 设有多项式

A(x)=7+3x+9x8+5x17 B(x)=8x+22x7-9x8

(1) 用单链表给出A(x)的存储表示。(画出单链表示意图) (2) 用单链表给出B(x)的存储表示。(画出单链表示意图)

- 12 -

(3) 以上述两个单链表为基础,通过插入和删除等运算得出A(x)+B(x)的存储表示,使其

存储空间覆盖A(x)和B(x)的存储空间。(画出单链表示意图)

五、算法设计题

1.长度为n的递增有序顺序表,请写一的算法,将x插入到顺序表的中,并保持该表的有序性。

2.试写实现顺序表的就地逆置的算法,即利用原表的存储空间将线性表(a1,a2,…,an)逆置成(an,an-1,…,a1) 3.对单链表实现就地逆置。

4.试写一个高效算法,删除单链表中所有大于min且小于max的元素(若表中存在这样的元素)同时释放被删除结点的空间,并分析你的算法的时间复杂度(min和max是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)

5. 已知数组A[1..n]的元素类型为整型。设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为o(n)。

6. 有两个按数据元素值递增有序排列的线性表A和B。编写算法将A表和B表归并成一个按元素值递增有序(即非递减有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。(请分A,B均以顺序表作存储结构和A,B均以单链表作存储结构,这两种情况写算法)。

7. 假设有两个按数据元素值递增有序排列的线性表A和B,均以单链表作存储结构。编写算法将A表和B表归并成一个按元素值递减有序(相同值元素只保留一个)排列的线性表C,并要求利用原表(即A表和B表的)结点空间存放表C。

8. 已知一单链表中的数据元素含有三个字符(即:字母字符、数字字符和其它字符)。试编写算法,构造三个循环链表,使每个循环链表中只含同一类的字符,且利用原表中的结点空间作为这三个表的结点空间(头结点可另辟空间)。

9. 已知两个单链表A和B分别表示两个集合,其元素递增排列,编写一个函数求出A和B的交集C,要求C同样以元素递增的单链表形式存储。

- 13 -

第 3 章 栈、队列和数组

一、单选题

1. 栈中元素的进出原则是( )。

(A) 先进先出 (B)后进先出 (C)栈空则进 (D)栈满则出 2. 栈的插入与删除操作在( )进行。

(A) 栈顶 (B) 栈底 (C) 任意位置 (D) 指定位置

3 .若让元素1,2,3依次进栈,则出栈次序不可能出现( )种情况。 (A) 3,2,1 (B) 2,1,3 (C) 3,1,2 (D) 1,3,2

4. 若用一个大小为6 的数组来实现循环队列,且当rear和front的值分别为O和3。当从队列中删除一个元素,再加入两个元素后,rear 和front 的值分别为( ) (A) l和5 (B) 2和4 (C) 4和2 (D) 5和l 5.一般情况下,将递归算法转换成等价的非递增归算法应该设置( )。 (A)堆栈 (B)队列 (C)堆栈或队列 (D)数组 6.链栈与顺序栈相比,有一个比较明显的优点即 ( ) (A)插入操作更方便 (B)通常不会出现栈满的情况 (C)不会出现栈空的情况 (D)删除操作更方便

7.设C语言数组Data[m+1]作为循环队列SQ的存储空间, front为队头指针,rear为队为指针,则执行出队操作的语句为( )

(A) front=front+1 (B) front=(front+1)%m (C) rear=(rear+1)%m (D) front=(front+1)%(m+1)

8. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,

则pi为

(A)i (B)n=i (C)n-i+1 (D)不确定

9. 设有一顺序栈T,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4,s6,s5,s1,则栈的容量至少应该是( )

(A)2 (B)3 (C) 5 (D)6

10.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为

- 14 -

(A)r-f (B)(n+f-r)% n (C)n+r-f (D)(n+r-f)% n 11.中缀表达式A-(B+C/D)*E的后缀形式是( ) (A) AB-C+D/E* (B) ABC+D/-E* (C) ABCD/E*+- (D) ABCD/+E*-

12.一个算术表达式的中缀形式为A+B*C-D/E,后缀形式为ABC*+DE/-,其前缀形式为( )。 (A) -A+B*C/DE (B) A+B*CD/E (C) -+*ABC/DE (D) -+A*BC/DE

13.循环队列A[0..m-1]存放其元素,用front和rear分别表示队头和队尾,则循环队列满的条件是( )。

(A)(Q.rear+1)%m==Q.front (B) Q.rear==Q.front+1 (C) Q.rear+1==Q.front (D) Q.rear==Q.front

14.解决计算机主机和打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印。该缓冲区应该是一个( )结构

(A)栈 (B)队列 (C)线性表 (D)数组 15.假设顺序栈的定义为: typedef struct {

selemtype *base; /* 栈底指针*/ selemtype *top; /* 栈顶指针*/

int stacksize; /* 当前已分配的存储空间,以元素为单位*/ }sqstack;

变量st的类型为sqstack,则栈st为空的判断条件为( )。 (A)st.base == NULL (B) st.top == st.stacksize (C) st.top-st.base>= st.stacksize (D) st.top == st.base

16.对于以行序为主序的存储结构来说,在数组A[c1···d1,c2···d2]中,c1和d1分别为数组A的第一个下标的上、下界,c2…d2分别为第二个下标的上、下界,每个数据元素占K个存储单元,二维数组中任一元素A[i,j]的存储位置可由( )式确定. (A) Loc[i,j]=[( d2-c2+1)(i- c1)+(j- c2)]*k

(B) Loc[i,j]=loc[c1, c2]+[( d2- c2+1)(i- c1)+(j- c2)]*k (C) Loc{i,j}=A[c1, c2]+[( d2- c2+1)(i- c1)+(j- c2)]*k (D) Loc[i,j]=loc[0,0]+[( d2- c2+1)(i- c1)=(j- c2)]*k

- 15 -

17.对于基于三元组的稀疏矩阵转置的处埋方法以下说法正确的是 ( ) (A)按照矩阵A的列序来进行转置,算法的时间复杂度为0(nu+tu) (B)按照A的三元组a.data的次序进行转置,算法的时间复杂度为O(nu*tu) (C)按照矩阵A的列序来进行转置的方法称快速转置 (D)按照矩阵A的列序进行转置,对于tu<

(A)非零元素 (B)三元组(i,j, aij) (C)aij (D)i,j

19.基于三元组的稀疏矩阵,对每个非零元素aij,可以用一个( )唯一确定。 (A)非零元素 (B)三元组(i,j,aij) (C)aij (D)i,j 20.三角矩阵可压缩存储到数组( )中。 (A) M[1:n(n+1)/2+1] (B) M[1:n(n+1)/2] (C) M[n(n+1)/2+1] (D) M[n(n+1)/2]

21. 二维数组M[i,j]的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从O到4,列下标j的范围从O到5。M按行存储时元素M[3,5] 的起始地址与M按列存储时元素( )的起始地址相同。

(A) M [2,4] (B) M[3,4] (C) M[3,5] (D) M[4,4] 二、判断题

1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 2. 队列是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。 3. 栈和队列是两种不同的数据结构。 4. 栈和队列是一种非线性数据结构。

5. 栈和队列的存储方式既可是顺序方式,也可是链接方式。 6. 当用户无法预估所用队列的最大长度,则宜采用链队列。 7. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。 8. 栈和队列都是限制存储点的线性结构。

9. 若将链栈看成一个单链表,则作进栈操作时,可以看成在单链表的首结点前插入新的结

点。

10. 若将链栈看成一个单链表,则作退栈操作时,可以看成在单链表的首结点被删除。 三、填空题

- 16 -

1.在一个无头结点的链队列中,若队首指针与队尾指针的值相同,则表示该队列为 或该队列 。

2.向一个栈顶指针为T的链栈中插入一个新结点*p时,应执行 和 。

3.从一个栈顶指针为T的非空链栈中删除结点并不需要返回栈顶结点的值和回收结点时,应执行 。

4.假定front和rear分别为一个无头结点的链队列的队首和队尾指针,则该链队列中只有一个结点的条件为 。 5.后缀表达式“45*32+-”的值为 。

6.一般地,一个n维数组可视为其数据元素为___________维数组的线性表。数组通常只有___________和___________两种基本运算。

7.通常采用___________存储结构来存放数组 。对二维数组可有两种存储方法:一种是以___________为主序的存储方式,另一种是以___________为主序的存储方式。C语言数组用的是以___________序为主序的存储方法。

8.需要压缩存储的矩阵可分为___________矩阵和___________矩阵两种。

9.对称方阵中有近半的元素重复, 若为每一对元素只分配一个存储空间 ,则可将n2个元素压缩存储到___________个元素的存储空间中。

10.假设以一维数组M(1:n(n+1)/2)作为n阶对称矩阵A的存储结构,以行序为主序存储其下三角(包括对角线)中的元素,数组M和矩阵A间对应的关系为___________。 11.上三角矩阵中,主对角线上的第t行(1<=t<=n)有___________个元素,按行优先顺序存放上三角矩阵中的元素aij时,aij之前的前i-1行共有___________个元素,在第i行上, aij是该行的第___________个元素,M[k]和aij的对应关系是_________。当i>j时,aij=c,c存放在M[___________]中。

12.下三角矩阵的存储和对称矩阵类似。M[K]和aij的对应关系是___________。

13.设有二为数组int M[10][20](注:m为0...10,n为0...20),每个元素(整数)栈两个存储单元,数组的起始地址为2000,元素M[5][10]的存储位置为___________,M[8][19]的存储值为___________。 四、解答题

1.若栈或队列采用顺序存储结构,则都存在“溢出”问题,请说明何谓“溢出”?

2. 有人说,采用循环链表作为存储结构的队列就是循环队列,你认为这种说法正确吗?说明你的理由。

- 17 -

3. 分别简述如何对一个前缀算术表达式求值的算法和一个后缀算术表达式求值的算法。 4.利用两个栈S1,S2模拟一个队列时,如何用栈的运算实现队列的插入、删除运算。请简述算法思想。

5. 设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运算后,有 ① front=11,rear=19; ② front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个? 9.设有三对角矩阵(aij)n*n,将其三条对角线上的元素逐行存于数组B(1:3n-2)中,使得B[k]=aij,求:

(1) 用i、j表示k的下标变换公式; (2) 用k表示i、j的下标变换公式. 五、算法设计题

1. 从键盘上输入一批整数,然后按相反的次序打印出来。

2. 试写一个算法,判别读入的一个以?@?为结束符的字符序列是否是“回文”,例如?abba?和?abcba?是回文,?abcde?和?ababab?则不是回文。

3. 判断算术表达式中的三种括号(圆括号,方括号,花括号)是否正确匹配。

4. 假设以数组que[m](假设数组范围在0..m)存放循环队列的元素,同时设变量rear和quelen分别指示循环队列中队尾元素位置和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法。

5. 用n个单元的一维数组构成的一个循环队列,试写由首指针front和尾指针rear计算出队列中元素个数的算法。

6.算术表达式由数字字母变量和加(+)、减(-)、乘(*)、除(\\)运算符组成,编写一个函数把中缀表达式转换为后缀表达式。为使问题简化,可不考虑中缀表达式不正确的情况。

7.设算术表达式由数字字母变量和加(+)、减(-)、乘(*)、除(\\)运算符组成,编写一个函数对以后缀表达式表示的算术表达式求值。为使问题简化,可不考虑后缀表达式不正确的情况。

8.假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的初始化队列、入队列和出队列算法。

9.编写算法:按行优先存储顺序,将稀疏矩阵转换为三元组的表示形式。

10.稀疏矩阵用三元组的表示形式,试写一算法实现两个稀疏矩阵相加,结果仍用三元组表示。

- 18 -

第 6 章 树和二叉树

一、单选题

1、一个结点拥有的子树数称为该结点的

A、权

B、维数

C、度

D、序

2、n个结点的线索二叉树中线索的数目为

A、(n-1)个

B、n个

C、(n+1)个

D、 (n+2)个

3、在有n个叶子结点的赫夫曼树中,其结点总数为

A、2n-1

B、2n

C、2n+1

D、2n+2

4、树最适合用来表示

A、有序数据元素

B、无序数据元素

D、元素之间无联系的数据

C、元素之间具有分支层次关系的数据

5、在一棵度为3的树中,度为3的结点个数为2,度为2 的结点个数为1,则度为0的结点个数为 A、4

B、5

C、6

D、7

6、二叉树是结点的有限集合,其根结点的个数

A、有0个或1个 C、有且只有1个

B、有0个或多个 D、有1个或1个以上

7、对二叉树从1开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用哪种遍历方式实现编号

A、先序遍历

B、中序遍历

C、后序遍历

D、层次遍历

8、某二叉树 T 有 n 个结点,设按某种顺序对 T 中的每个结点进行编号,且有如下性质:T 中任一结点 v,其编号等于左子树上的最小编号减 1,而 v 的右子树的结点中,其最小编号等于 v 左子树上的结点的最大编号加1,则可采用哪种遍历方式实现编号 A、先序遍历

二、判断题

1、一棵满二叉树,有n个结点,深度为h,则n=2h-1。 2、度为2的树是二叉树。

B、中序遍历

C、后序遍历

D、层次遍历

- 19 -

3、满二叉树一定是完全二叉树。 4、完全二叉树就是满二叉树。

5、深度为 h 的非空二叉树的第 i 层最多有 2 i-1个结点。

6、二叉树叶子结点的数目只与度为 2 的结点的数目有关,而与度为 1 的结点的数目无关。 7、一棵有 n ≥ 1 个结点的 d 度树,若用多重链表表示,树中每个结点都有 d 个链域,则在树的 nd个链域中,有 n(d-1)+1个是空域,只有 n-1个是非空链域。

8、若有一个结点是某二叉树子树的中序遍历序列中的最后一个结点,则它必是该子树的先序遍历序列中的最后一个结点。

9、若有一个结点是某二叉树子树的先序遍历序列中的最后一个结点,则它必是该子树的中序遍历序列中的最后一个结点。

10、不使用递归,也可实现二叉树的先序、中序和后序遍历。 11、由二叉树的先序序列和中序序列可以唯一确定一棵二叉树。 12、由二叉树的中序序列和后序序列可以唯一确定一棵二叉树。 13、由二叉树的先序序列和后序序列可以唯一确定一棵二叉树。 14、给定一组权值,可以唯一构造出一棵赫夫曼树。 15、赫夫曼树一定是完全二叉树。 16、赫夫曼树中没有度为 1 的结点。

17、在赫夫曼编码中,当两个字符出现的频率相同时,其编码也相同,对于这种情形应作特殊处理。

18、将一棵树转换成二叉树(即,孩子兄弟树)存储,则根结点没有左子树。

三、填空题

1、三个结点的树的共有___________种形态,三个结点的二叉树共有___________种形态。 2、已知二叉树中叶子结点数为50,仅有一个孩子的结点数为30,则总结点数为________。 3、深度为 6 的满二叉树共有___________个度为 2 的分支结点。

4、在二叉链表中,判断某指针p所指结点为叶子结点的条件是_______________________。 5、任何非空树中有且仅有一个结点没有前驱结点,该结点就是树的___________。 6、已知树中结点总数为 n,则此树中所有结点的度之和为___________。

7、在具有n个结点的各棵树中,其中深度最小的那棵树的深度是___________,它共有___________个叶子结点和___________个分支结点;其中深度最大的那棵树的深度是

- 20 -

___________,它共有___________个叶子结点和___________个分支结点。

8、设深度为 h 的二叉树只有度为 0 和 2 的结点,该二叉树的结点数可能达到的最大值为___________,最小值为___________。

9、已知按先序遍历二叉树的结果为ABC,则共有___________种不同的二叉树可以得到这一遍历结果。

四、解答题

1、已知一棵二叉树的先序遍历序列是ABCDEFGHIJK,中序遍历序列是CDBGFEAHJIK,请构造出该二叉树,并给出该二叉树的后序遍历序列。 2、已知五个权值分别为9,2,5,7,14的叶子结点:

①构造一棵赫夫曼树; ②求此树的带权路径长度。 3、将下图所示的森林转化为二叉树。

ABCE4、已知二叉树的二叉链表定义如下: typedef char TElemType; typedef struct BiTNode { TElemType data;

struct BiTNode *lchild,*rchild; }*BiTree;

FDHGIJ

BiTree root;//root是指向以下二叉树根结点A的指针

- 21 -

ABCE

void traversal(BiTree T) { if (T) {

printf(\,T->data); traversal(T->lchild); printf(\,T->data); traversal(T->rchild); } }

试回答下列问题:

⑴给出算法traversal(root)的输出结果; ⑵分析算法traversal的时间复杂度。

5、已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,……,nk个度为k 的

结点,问该树中有多少个叶子结点?

6、已知在一棵含有n 个结点的树中,只有度为k 的分支结点和度为0的叶子结点。试求该树含有的叶子结点的数目。 7、找出所有满足下列条件的二叉树:

⑴它们在先序遍历和中序遍历时,得到的结点访问序列相同; ⑵它们在后序遍历和中序遍历时,得到的结点访问序列相同; ⑶它们在先序遍历和后序遍历时,得到的结点访问序列相同。 8、对第3题中森林分别进行先序遍历和中序遍历,给出遍历结果。

- 22 -

DFG

9、一棵含有n个结点的k叉树,可能达到的最大深度和最小深度各为多少?

10、已知一棵二叉树的层次遍历序列是ABCDEFGHIJ,中序遍历序列是DBGEHJACIF,请

构造出该二叉树。

五、算法设计题

注:下列各题中的二叉树如未特殊说明均采用二叉链表作为存储结构。

1、参照课本提供的CreateBiTree和PreOrderTraverse算法,完成对下图所示二叉树的创建以及先序、中序和后序遍历操作。

ABCE2、 求二叉树中分支结点和叶子结点的数目。 3、 求二叉树的深度。

4、 销毁二叉树中的所有结点,要求在销毁每一个结点前,输出该结点的数据域。 5、 编写从上至下、从左到右按层次遍历二叉树的算法。 6、 编写递归算法:将二叉树中所有结点的左、右子树相互交换。 7、 编写算法判别给定二叉树是否为完全二叉树。

8、 编写递归算法:输出在二叉树的先序序列中第k个位置的结点的数据域。

9、 一棵二叉树的繁茂度定义为各层结点数的最大值与树的深度的乘积,编写算法求二叉树

的繁茂度。

10、为二叉链表的结点中增加DescNum域,编写算法求二叉树每个结点的子孙数目并存入

其DescNum域。

11、已知一颗二叉树的先序序列和中序序列,写一个建立该二叉树的二叉链表存储结构的算

法。

12、给出二叉树中的一个非根节点(由指针p所指),求它的兄弟节点(要求用指针q指向

它,若没有兄弟节点,这q为空)。

- 23 -

DFG

13、设计一个中序遍历非递归算法。 14、设计一个后序遍历非递归算法。

15、已知n个节点的完全二叉树已经顺序存储在一维数组A[1…n]中,试设计一算法将其变

成二叉链表存储的完全二叉树。

- 24 -

第 7 章 图

一、单选题

1、 在一个图中,所有顶点的度数之和等于图的边数的 倍。

A. 1/2 B.1 C. 2 D. 4

2、 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的 A. 1/2 B.1 C. 2 D. 4 3、 有8个结点的无向图最多有 条边。

倍。

A. 14 B. 28 C. 56 D. 112 4、 有 8 个结点的有向完全图有 条边(弧)。

A. 14 B. 28 C. 56 D. 112 5、 用邻接表表示图进行广度优先遍历时,通常采用 来实现算法的。

A.栈 B.队列 C. 树 D.图 6、 用邻接表表示图进行深度优先遍历时,通常采用 来实现算法的。

A.栈 B.队列 C. 树 D.图 7、 深度优先遍历类似于二叉树的 。

A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 8、 广度优先遍历类似于二叉树的 。

A.先序遍历 B.中序遍历 C.后序遍历 D.层次遍历 9、 对如下图所示的无向图 G ,若从顶点 Vl 开始,按深度优先搜索法进行遍历,则可能

的访问顺序为

A. Vl V2 V5 V8 V4 V6 V7 V3 B. Vl V2 V3 V4 V5 V6 V7 V8 C. VI V2 V3 V4 V8 V5 V6 V7 D. Vl V2 V4 V5 V8 V3 V6 V7

顺序为

10、对如图所示的无向图,若从顶点 V1开始,按广度优先搜索法进行遍历,则可能访问的

A. VI V2 V3 V4 V5 V6 V7 V8 B. VI V2 V6 V3 V4 V7 V8 V5 C. VI V2 V6 V3 V4 V5 V7 V8 D. VI V2 V4 V7 V3 V8 V6 V5

- 25 -

11、对如图所示的有向图 G ,它的拓扑序列是 。

A. a , b , c , d B. a , d , b , c C. a , b , d , c D. b , a , d , c 12、对如下所示的图,它的生成树有 棵。

A. 1 B. 5 C. 6 D.不确定

13、如图所示的有向图的顶点可以排成 个不同的拓扑序列。

A.3 B.5 C. 7 D.9 14、一个有n个结点的图,最少有 个连通分量,最多有 个连通分量。

A.0 B.1 C.n-1 D.n 15、用有向无环图描述表达式(A+B)*((A+B)/A),至少需要顶点的数目为 A.5 B.6 C.8 D.9 16、下列说法不正确的是 。

A.图的遍历是从给定的源点出发每一个顶点仅被访问一次 B.遍历的基本算法有两种:深度遍历和广度遍历

- 26 -

C.图的深度遍历不适用于有向图 D.图的深度遍历是一个递归过程

17、无向图G=(V,E),其中:V={a,b,c,d,e,f}, E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图进

行深度优先遍历,得到的顶点序列正确的是

A.a,b,e,c,d,f B.a,c,f,e,b,d C.a,e,b,c,f,d D.a,e,d,f,c,b 18、下面 方法可以判断出一个有向图是否有环(回路):

A.深度优先遍历 B. 拓扑排序 C. 求最短路径 D. 求关键路径 19、在图采用邻接表存储时,求最小生成树的 Prim 算法的时间复杂度为 A. O(n) B. O(n+e) C. O(n2) D. O(n3) 20、求解最短路径的Floyd算法的时间复杂度为 。

A.O(n) B. O(n+c) C. O(n*n) D. O(n*n*n) 21、已知有向图G=(V,E),其中V={V1,V2,V3,V4,V5,V6,V7},

E={,,,,,,,,},G的拓扑序列是

A.V1,V3,V4,V6,V2,V5,V7 B.V1,V3,V2,V6,V4,V5,V7 C.V1,V3,V4,V5,V2,V6,V7 D.V1,V2,V5,V3,V4,V6,V7

22、在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前,则下列情形不可能出现的是 。

A.G中有弧 B.G中有一条从Vi到Vj的路径 C.G中没有弧 D.G中有一条从Vj到Vi的路径 23、在用邻接表表示图时,拓扑排序算法时间复杂度为 。

A. O(n) B. O(n+e) C. O(n*n) D. O(n*n*n) 二、判断题

1、 在n个结点的无向图中,若边数大于n-1,则该图必是连通图。 2、 有e条边的无向图,在邻接表中有e个结点。

3、 有向图中顶点V的度等于其邻接矩阵中第V行中的1的个数。 4、 强连通图的各顶点间均可达。

5、 用邻接矩阵法存储一个图所需的存储单元数目与图的边数有关。

6、 有n个顶点的无向图, 采用邻接矩阵表示, 图中的边数等于邻接矩阵中非零元素之和的

- 27 -

一半。

7、 有向图的邻接矩阵是对称的。 8、 任何无向图都存在生成树。

9、 一个有向无环图的拓扑排序序列是唯一的。 10、关键路径是AOE网中从源点到终点的最长路径。

三、填空题

1、 设有一稀疏图 G ,则 G 采用__________存储比较节省空间;

设有一稠密图 G ,则 G 采用__________存储比较节省空间。

2、 n 个顶点 e 条边的图采用邻接矩阵存储,深度优先搜索遍历算法的时间复杂度为

____________,采用邻接表存储,深度优先搜索遍历算法的时间复杂度为___________。 3、 n 个顶点的完全图有___________条边。

4、 有 n 个顶点的无向连通图至少有 条边,有 n 个顶点的有向强连通图至少

有 条弧。

5、 用邻接矩阵表示无向图时,若图中有 n = 500 个顶点, m = 500 条边,则形成的邻接

矩阵共有 个元素,其中 个为非零元素。

6、 判断一个无向图是一棵树的条件是 。 7、 若用n表示图中顶点数目,则有_______条边的无向图成为完全图。 8、 G是一个非连通无向图,共有28条边,则该图至少有______个顶点。

9、 在图G的邻接表表示中,每个顶点邻接表中所含的结点数,对于无向图来说等于该顶

点的______;对于有向图来说等于该顶点的______。

10、 对于一个具有n个顶点e条边的无向图的邻接表的表示,则表头向量大小为______,邻接表的边结点个数为______。

11、已知一无向图G=(V,E),其中V={a,b,c,d,e } E={(a,b),(a,d),(a,c),(d,c),(b,e)}现用某一

种图遍历方法从顶点a开始遍历图,得到的序列为abecd,则采用的是______遍历方法。 12、为了实现图的广度优先搜索,除了一个标志数组标志已访问的图的结点外,还需______存放被访问的结点以实现遍历。

13、Prim(普里姆)算法适用于求______的网的最小生成树;kruskal(克鲁斯卡尔)算法适

用于求______的网的最小生成树。

14、克鲁斯卡尔算法的时间复杂度为______,它对______图较为适合。

- 28 -

四、解答题

1、 已知无向图的邻接表如下,①在给出顶点的图上,画出这个图的边;②写出该图的邻接

矩阵A;③根据邻接表,写出从顶点V1出发,深度优先遍历该图所得到的顶点序列。

1 2 3 4 5

提示:

V1 V3 V4 V2 V5 2、 己知一无向图有 6 个结点, 9 条边,这 9 条边依次为( 0 , l ) , ( 0 , 2 ) , ( 0 , 4 ) , ( 0 ,

5 ) ,( l , 2 ) , ( 2 , 3 ) , ( 2 , 4 ) , ( 3 , 4 ) , ( 4 , 5 )。试画出该无向图,并从顶点 0 出发分别写出按深度优先搜索和广度优先搜索进行遍历的结点序列。 3、 已知如图1 所示的有向图,给出该图的:

① 每个顶点的出度和入度; ② 强连通分量; ③ 最长的简单路径; ④ 最长的简单回路;

⑤ 进行拓扑排序,给出顶点的拓扑序列。

4、 对如图2所示的连通图,列出分别从顶点 A 、 D 开始,深度优先和广度优先搜索遍

历该图所得到的顶点序列,画出相应的生成树。

图1 图2

5、 设无向图G=(V,E),其中V={1,2,3,4,5},E={(1,2,4),(2,5,5),

(1,3,2),(2,4,4),(3,4,1),(4,5,3),(1,5,8)},每条边由一个三元组表示,三元组中前两个元素为与该边关联的顶点,第三个元素为该边的权。请写出图G中从顶点1到其余各点的了短路径的求解过程。要求列出最短路径上的顶点,并计算路径长度。

- 29 -

6、 下图是以边为活动的网(AOE_网),以V1为开始点,以V10为终止点,计算该AOE_

网的关键路径长度(即,从开始点到终止点的最长路径长度)。

7、 对如下无向图,试给出:

① 用普里姆算法构造最小生成树的过程 ② 用克鲁斯卡尔算法构造最小生成树的过程

五、算法设计题

1、 图G为有向无权图,试在邻接矩阵存储结构上实现删除一条边(v,w)的操作:

DeleteArc(G,v,w)。若无顶点v或w,返回“ERROR”;若成功删除,则边数减1,并返回“OK”。(提示:删除一条边的操作,可以将邻接矩阵的第i行全部置0 ),完成该算法。 Status DeleteArc(MGraph &G,char v,char w) //在邻接矩阵表示的图G上删除边(v,w) { if ((i=LocateVex(G, v))<0) return if ((j=LocateVex(G, w))<0) return if (G.arcs[i][j].adj)

{ G.arcs[i][j].adj= ;

G.arcnum ; (或 G.arcnum=G.arcnum-1 ) } return }

;

; ;

3 E B 5 6 6 4 F 6 A 1 C 5 2 5 D - 30 -

2、 一个图采取以下结构,完成下列遍历算法。

void BFSTraverse(Graph G, Status (*Visit)(int v)) { for (v=0; v

visited[v] = FALSE; //初始化访问标志 InitQueue(Q); // 置空的辅助队列Q for ( v=0; v

if ( ) { // v 尚未访问

visited[v] = TRUE; Visit(v); // 访问u EnQueue(Q, v); // v入队列 while (!QueueEmpty(Q)) {

DeQueue(Q, u); // 队头元素出队并置为u

for(w=FirstAdjVex(G, u); w>=0; w=NextAdjVex(G,u,w)) if ( ! visited[w]) { visited[w]= ; Visit(w);

EnQueue(Q, w); // 访问的顶点w入队列

} // if

} // while

} //if } // BFSTraverse

3、编程实现:用邻接表的存储方法创建一个图。 4、编程实现:对3题建立的图进行深度优先搜索。

- 31 -

第 9 章 查找

一、单选题

1、静态查找表与动态查找表两者的根本差别在于 A、逻辑结构不同 B、 存储实现不同 C、施加的操作不同 D、 数据元素的类型不同

2、采用顺序查找方法查找长度为n的线性表时,每个元素的平均查找长度为 A、n

B、n/2 C、(n+1)/2 D、(n-1)/2

3、对线性表进行二分查找时,要求线性表必须 A、以顺序方式存储

B、以链式方式存储

C、以顺序方式存储,且结点按关键字有序排序 D、以链式方式存储,且结点按关键字有序排序

4、在表长为n的顺序表中进行顺序查找,在查找不成功时,与关键字比较的次数为 。

A、n B、1 C、 n+1 D、n-1

5、对于有序表(2,5,7,11,22,45,49,62,71,77,90,93,120),折半查找值为90的结点时,经过 比较后查找成功。

A、 1 B、 2 C、4 D、5 6.快速排序在最坏情况下的时间复杂度是( )。 A、O(log2n) B、O(nlog2n) C、O(n2) D、O(n3)

7、如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用 查找方法。

A、分块 B、顺序 C、二分 D、散列

8、有一个长度为12的有序表,按二分查找法对该表进行查找,在表内各元素等概率情 况下查找成功所需的平均比较次数为

A、35/12 B、37/12 C、39/12 D、43/12 9、当采用分块查找时,数据的组织方式为 A、数据分为若干块,每块内数据有序

B、数据分为若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)

- 32 -

的数据组成索引块

C、数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块 D、数据分为若干块,每块(除最后一块外)中数据个数需相同 10.在排序过程中,键值比较的次数与初始序列的排列顺序无关的是()。 A、直接插入排序和快速排序 B、直接插入排序和归并排序 C、直接选择排序和归并排序 D、快速排序和归并排序和归并排

11、从键盘依次输入关键字的值:t,u,r,b,o,p,a,s,c,l。建立二叉排序树,则先序遍历序列为 。

A、 abcloprstu B、 alcpobsrut C、 trbaoclpsu D、 trubsaocpl

12、设有一组记录的关键字为{19,24,23,1,68,20,84,27,55,11,10,79},用链地址法构造哈希表,哈希函数为H(KEY)=KEY MOD 13 ,哈希地址为1的链中有 个记录。

A、1 B、2 C、3 D、4

13、在采用线性探测法处理冲突所构成的闭散列表上进行查找,可能要探测多个位置,在查找成功的情况下,所探测的这些位置上的健值

A、一定都是同义词 B、 一定都不是同义词 C、都相同 D 、健值不一定有序的顺序表

14、设哈希表长为14,哈希函数为H(key)= key mod 11,表中已经有4个结点:addr(14)=3, addr(38)=5, addr(61)=6, addr(85)=8,其余地址为空,用线性探测再散列法解决冲突,关键字为49的结点的地址为 。

A、7 B、3 C、5 D、 4

15、设有序表的关键字序列为{1,4,6,10,18,35,42,53,67,71,78,84,92,99},当用二分查找法查找健值为84的结点时,经

次比较后查找成功。

A、2 B、 3 C、 4 D、 12

16、已知一采用开放地址法解决Hash表冲突,要从此Hash表中删除一个记录,正确的做法是

A、将该元素所在的存储单元清空。 B、将该元素用一个特殊的元素代替

C、将与该元素有相同Hash地址的后继元素顺次前移一个位置。 D、用与该元素有相同Hash地址的最后插入表中的元素替代。

- 33 -

17、以下说法错误的是 。

A、数字分析法对健值的各位进行分析,选择分布较均匀的若干位组成散列地址。 B、除余法选择一个适当的正整数p,以p除健值以所得的余数作为散列地址。 C、平方取中法以健值平方的中间几位作为散列地址。

D、基数转换法将健值看成另一种进制的数再转换成原来进制的数,然后选择其中几位作为散列地址。

18、下面关于B-树和B+树的叙述中,不正确的是 。

A、B-树和B+树都是平衡的多叉树 B、B-树和B+树都可用于文件的索引结构 C、B-树和B+树都能有效地支持顺序检索 D、B-树和B+树都能有效地支持随机检索 19、下列关于m阶B-树的说法错误的是 。

A、根结点至多有m棵子树。 B、 所欲叶子都在同一层 C、非叶子结点至少有m/2(m为偶数)或m/2+1(m为奇数)棵子树 D、根结点中的数据都是有序的。

20、一棵3阶B-树中含有2047个关键字,包含叶结点层,该树的最大深度为 A、11 B、12 C、13 D、 14

21、一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有 个结点。

A、2k-1-1 B、 2k-1 C、2k-1+1 D、2k-1

22、分别以下列序列构造二叉排序树,与用其他三个序列所构造的结果不同的是 。

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)

23、设二叉排序树中关键字由1至1000的整数构成,现要查找关键字为363的结点,下述关键字序列哪一个不可能是在二叉排序树上查到的序列? A、2,252,401,398,330,344,397,363; B、924,220,911,244,898,258,362,363; C、925,202,911,240 ,912,245,363;

D、2,399,387,219,266,382,381,278,363。

- 34 -

24、在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点的左孩子的平衡因子为0,右孩子的平衡因子为1,则应作 A 、LL B、 LR C、 RL D、 RR

二、判断题

1、n个数放在一维数组中,在进行顺序查找时,这n个数的排列有序或无序其平均查找长度不同。

2、若散列表的装填因子小于1,则可避免碰撞的产生。 3、哈希表的平均查找长度与处理冲突的方法无关。 4、对无序表用折半法查找比顺序查找法快。

5、在二叉排序树中插入一个新结点,总是插入到叶节点下面。

6、平衡二叉树中,若某个结点的左、右孩子的平衡因子为零,则该结点的平衡因子一定是零。

7、对两棵具有相同关键字而形状不同的二叉排序树,按中序遍历得到的序列却是一致的。 8、完全二叉树肯定是平衡二叉树

9、在9阶B-树中,除叶子以外的任意结点的分支数介于5和9之间。

10、如果完全二叉树从根结点开始按层次遍历的序列为1,2,3,4,5,6,7,则该完全二叉树是二叉排序树。

11、m阶B-树的任何一个结点的左右子树高度都相等。

12、设二叉排序树中关键字互不相同,则其中最小元必无左孩子,最大元必无右孩子。 13、对给定的关键字集合,以不同的次序插入初始为空的树中,将得到同一棵二叉排序树。 三、填空题

1. 动态查找表和静态查找表的重要区别在于前者包含有 后者不包含这两种运算。

2.对n个记录的表中进行折半查找,最大比较次数是 。

和 运算,而

型调整以使其平衡。

3.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为 次;当使用监视哨时,若查找失败,则比较关键字的次数为

4.已知有序表为(12,18,24,35,47,50,62,83,90,115,134),当用二分法查找90时,需

次查找成功,查找47时需 次成功,查找100时,需 次才能确定不成功。

- 35 -

5.在具有24个元素的有序表上进行二分查找,则比较一次查找成功的结点数为______,比较二次查找成功的结点数为________,比较三次查找成功的结点数为_________,比较四次查找成功的结点数为________,比较五次查找成功的结点数为__________。总的比较查找长度为__________。

6.使用分块查找时,除表本身外,尚需建立一个 及该块的起始位置。

7.采用散列技术来实现查找,需要解决的问题有:

; ;

,用来存放每一块中的最大值以

8.、在各种查找方法中,平均查找长度与结点个数无关的查找方法是 9.含有12个结点的平衡二叉树的最大深度是 。(设根结点深度为1)

10.如果将n个元素,按其关键字递增的顺序依次插入到二叉排序树中,则对这样的二叉排序树检索时,平均比较次数为

个,除根

11.在一个127阶的B-树上,每个结点中包含的关键字数目最多允许为 结点外的非终端至少有

棵子树。

12. 一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有 个结点。

个;最少可以是 13.高度为5的平衡二叉树;其结点数最多可以有 个。

14.在一棵m阶的B-树中,当一关键字插入某结点而引起该结点分裂时,此结点原有 个关键字。若删去某结点中的一个关键字,而导致该结点合并时,该结点中原有 个关键字。

15.一个待散列存储的线性表为(18,34,58,26,75,67,48,93,81),哈希函数为H(key)=key ,若采用线性探测法解决冲突,则平均查找长度为 地址法解决冲突,则平均查找长度为

;若采用链16.假定有k个关键字互为同义词,若用线性探测法把这k个关键字存入散列表中,至少要进行

四、解答题

1.简述顺序查找法,折半查找法和分块查找法对被查找表中元素的要求。

- 36 -

探测。

2.假定对有序表(3,4,5,7,24,30,42,54,63,72,87,95)进行折半查找,试回答下列问题: (1)画出描述折半查找过程的判定树。 (2)若查找元素54,需依次与那些元素比较。 (2)若查找元素90,需依次与那些元素比较。 (3)求查找成功时的平均查找长度。

3、对下面的关键字集{30,15,21,40,25,26,36,37}若查找表的装填因子为0.8,采用线性探测再散列方法解决冲突,哈希函数为H(key)=key% 7,画出该哈希表,并计算查找成功的平均查找长度。

4.设有一组关键字{ 9,1,23,14,55,20,84,27 }.采用哈希函数:H(key)=key%7。 采用开放地址法的二次探测再散列方法解决冲突

Hi?(H(key)?di)mod10(di?12,22,?),试对该关键字序列构造哈希表,并计算查找

成功的平均查找长度。

5.输入一个正整数序列(17,31,13,11,20,35,25,8,4,11,24,40,27)画出该二叉排序树。依此二叉排序树,如何得到一个递增序列?

6.一棵二叉排序树结构如下图所示,各结点的值分别为1,2,3,...9,请在图中标出各结点的值。

第6第第

7.已知插入结点的序列为(17,31,13,11,20,35,25,8,4,11,24,40,27),请画出该二叉排序树,并分别给出下列操作后的二叉排序树:

(1)插入数据9; (2)删除数据17; (3)再删除结点13;

8.按下列次序输入关键字:(E,F,P,K,M,L,B),请画出AVL树的构造和调整过程。要求画出每插入一个关键字后查找树的形状及调整后的结果,并标明调整类型。

- 37 -

9.深度为6的平衡二叉树中最少应包含多少个结点,并画出这样一棵平衡二叉树。 10.从空树开始,依次输入结点20,30,50,52,60,68,70,画出建立3阶B-树的过程。并画出删除结点50和68后的B-树状态。

五、算法设计题

1.设顺序表中关键字是递增有序的,试写一顺序查找算法,将哨兵设在表的高下标端。然后求出等概率情况下查找成功与失败时的ASL。

2.试编写一个判别给定的二叉树是否为二叉排序树的算法。设此二叉树以二叉链表为存储结构,且树中结点的关键字均不相同.

3. 试写一递归算法,从大到小输出二叉排序树中所有其值不小于X的关键字。

4.设二叉排序树的各元素均不相同,试分别采用递归和非递归算法按递减顺序打印所有左子..树为空,右子树非空的结点的数据域的值。

5. 试编写一个算法,删除二叉排序树中所有关键字不小于x的结点,并释放该结点空间。 6. 试编写一个算法,将两棵二叉排序树合并为一棵二叉排序树。

7.写出从哈希表中删除关键字为k的一个记录的算法;设哈希函数为H,解决冲突的方法为链地址法。

- 38 -

第 10 章 内部排序

一、单选题

1.在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是 (A)希尔排序 (B)起泡排序 (C)插入排序 (D)选择排序 2.在待排序的元素序列基本有序的前提下,效率最高的排序方法是 (A)插入排序 (B)选择排序 (C)快速排序 (D)归并排序

3.设有5000个无序的元素,希望用最快的速度挑选出其中前l0个最大的元素,最好选 用

排序法。

。 。

(A)起泡排序 (B)快速排序 (C)堆排序 (D)基数排序

4.排序方法中,从未排序序列中依次取出元素与已排序序列(初始为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为

(A)希尔排序 (B)起泡排序 (C)插入排序 (D)选择排序 5.下列排序算法中,稳定的是 。

(A)直接插入排序和快速排序 (B)折半插入排序和冒泡排序 (C)简单选择排序和四路归并排序 (D)树形选择排序和希尔排序 6.下述几种排序方法中,平均查找长度最小的是 。

(A)插入排序 (B)直接选择排序 (C)快速排序 (D)归并排序 7.下述几种排序方法中,要求内存量最大的是 。

(A)插入排序 (B)选择排序 (C)快速排序 (D)、归并排序 8.快速排序方法在 情况下最不利于发挥其长处。

(A)要排序的数据量太大 (B)要排序的数据中含有多个相同值 (C)要排序的数据已基本有序 (D)要排序的数据个数为奇数 9.下列排序方法中, 可能出现这种情况:在最后一趟开始之前,所有元素都不在

其最终应在的正确位置上。

(A)快速排序 (B)冒泡排序 (C)堆排序 (D)插入排序

10.当初始序列已按健值有序时,用直接插入算法进行排序,需要比较的次数为 (A) n-1 (B)log2n (C) 1 (D)n2

- 39 -

11.快速排序在最坏的情况下的时间复杂度是 。

(A) O(log2n) (B)O(nlog2n) (C) O(n2) (D)O(n3) 12.在排序过程中,健值比较的次数与初始序列的排列顺序无关的是 (A)直接插入排序和快速排序 (B)直接插入排序和归并排序 (C)直接选择排序和归并排序 (D)快速排序和归并排序 13.下列排序方法中,哪一个是稳定的排序方法 。

(A)直接选择排序 (B)二分法插入排序 (C)希尔排序 (D)快速排序 14.在文件“有序”或文件长度较小的情况下,最佳内部排序的方法是 (A)直接插入排序 (B)选择排序 (C)冒泡排序 (D)快速排序

15.对一个由n个整数组成的序列,借助排序过程找出其中的最大值,希望比较次数和移动次数最少,应选用

方法。

(A)归并排序 (B)直接插入排序 (C)直接选择排序 (D)快速排序 16.下列排序算法中 排序在一趟结束后不一定能选出一个元素在其最终位置上。

(A) 选择排序 (B)冒泡排序 (C)归并排序 (D)堆排序

17.一组记录的关键字为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序表,用归并排序方法对该序列进行一趟归并后的结果为 (A).15,25,35,50,20,40,80,85,36,70 (B)15,25,35,50,80,20,85,40,70,36 (C)15,25,50,35,80,85,20,36,40,70 (D)15,25,35,50,80,20,36,40,70,85

18. 一组记录的关键字为(56,34,23,38,40,69),则利用直接插入排序的方法,经过 3趟排序之后,其关键字序列为 。

(A) 34,56,23,38,40,69 (B) 34,38,23,56,40,69 (C) 23,34,56,38,40,69 (D) 23,34,38,56,40,69

19. 数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的 排序后的结果。

(A)选择排序 (B)冒泡排序 (C)插入排序 (D)堆排序

20. 一组记录的关键码为(46,79,56,38,40,84),用堆排序的筛选方法建立的初始堆为 。

的两趟

(A) 79,46,56,38,40,80 (B) 84,79,56,38,40,46

- 40 -

(C) 84,79,56,46,40,38 (D)A,B,C都不对 21. 下面四个序列中, 是一个堆。

(A)16,72,31,23,94,53 (B)94,53,31,72,16,23 (C) 16,53,23,94,31,72 (D) 16,31,23,94,53,72

22. 一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为

(A)38,40,46,56,79,84 (B)40,38,46,79,56,84 (C)40,38,46,56,79,84 (D)40,38,46,84,56,79

23. 用某种排序方法对线性表(25,84,21,47,15,27,68,35,20) )进行排序时,元素序列的变化情况如下:

(1)25,84,21,47,15,27,68,35,20 (2)20.15.21.25,47,27,68,35,84 (3)15,20,21,25,35,27,47,68,84 (4)15,20,21,25,27,35,47,68,84

则所采用的排序方法是

(A)选择排序 (B)希尔排序 (C)归并排序 (D)快速排序

24. 对序列(15,9,7,8,20,-1,4)进行排序,进行一趟后数据的排列变为(4,9,-1,8,20,7,15)则采用的是 排序。

(A) 选择 (B) 快速 (C) 希尔 (D) 起泡

25. 对(05,46,13,55,94,17,42)进行基数排序,一趟排序的结果是 。

(A)(05,46,13,55,94,17,42) (B)(05,13,17,42,46,55,94) (C)(42,13,94,05,55,46,17) (D)(05,13,46,55,17,42,94) 二、填空题

1、若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是________的,否则称为________的。

2、按照排序过程涉及的存储设备的不同,排序可分为________排序和________排序。 3、按排序过程中依据的不同原则对内部排序方法进行分类,主要有:________、________、________、________等四类。

4、简单选择排序算法在最好情况下和最坏情况下的时间复杂度分别为_________和

- 41 -

_________。

5、高度为h的堆中,最多有_______ 个元素,最少有_______个元素。

6、若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的___________ 和记录的___________。

7、在堆入排序、希尔排序、选择排序、快速排序、堆排序、归并排序和基数排序中,排序是不稳定的有______________________ 。

8、设表中元素的初始状态是按键值递增的,分别用堆排序、快速排序、冒泡排序和归并排序方法对其仍按递增顺序进行排序,则___________最省时间,___________最费时间。 9、直接插入排序用监视哨的作用是_________________。

10、在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置需比较________次。

11、利用快速排序方法对记录(50,40,95,20,15,70,60,45,80)进行快速排序,其需递归调用的次数为________,其中第二次递归调用是对________组记录进行快速排序。 12、在堆排序,快速排序和归并排序中,若只从存储空间考虑,则首先选取________方法,其次选取________方法;若只从排序结果的稳定性考虑,则应选取________方法;若只 从平均情况下排序最快考虑,则应选取________方法;若只从最坏情况下排序最快并且要节省内存考虑,则应选取________方法。

13、对于关键字序列(12,13,11,18,60,15,7,20,25,100),用筛选法建堆,必须从键值为 的关键字开始

三、判断题

1、 直接选择排序在最好情况下的时间复杂度是O(n)。

2、 在初始数据表已经有序时,快速排序算法的时间复杂度为O(nlogn)。 3、 在用堆排序算法排序时,如果要进行增序,则需要采用“大顶堆”。 4、 在待排数据基本有序的情况下,快速排序的效果最好。 5、 两分法插入排序所需比较次数与待排序记录的初始状态相关。 6、 希尔排序的最后一趟与直接插入排序过程相同。 7、 在任何情况下,归并排序都比简单排序速度快。 8、 堆是满二叉树。

9、堆肯定是一棵平衡二叉树。

- 42 -

10、内排序要求数据一定要以顺序方式存储。

11、快速排序和归并排序在最坏情况下的比较次数都是O(nlogn)。 12、用希尔排序法时,若关键字的初始排序杂乱无序,则排序效率就低。 13、基数分类只适用于以数字为关键字的情况,不适用以字符串为关键字的情况。 14、若中序遍历平衡的二叉排序树,可得到排好序的关键字序列。

15、在执行某个排序算法过程中,出现了排序码朝着最终排序序列位置相反方向移动,则该算法是不稳定的。

四、解答题

1.已知数据序列为(12,5,9,20,6,31,24),对该数据序列进行排序,试写出插入排序和冒泡排序每趟的结果。

2.判断下列两序列是否为堆?如不是,按照建堆的思想把它调整为堆,并用图表示建堆的过程。

(1)(100,90,80,60,85,75,20,25,10,70,65,50); (2)(100,70,50,20,90,75,60,25,10,85,65,80)。

3.对于下列一组关键字(12,2,16,30,8,28,4,10,20,6,18),试写出用下列算法从小到大排序时第一趟结束时的序列。 (1)希尔排序(第一趟排序的增量为5) (2)快速排序(选第一个记录为枢纽) (3)基数排序。

4.有n个不同的英文单词,它们的长度相等,均为m,若n>>50,m<5,试问采用什么排序方法时间复杂性最佳?为什么?

5. 已知序列(54,21,52,14,98,47,41,75,5,62),请给出采用堆排序法对该序列作升序排序时的每一趟结果。

6.已知序列(53,82,62,71,93,70,34,25,47,29),请给出采用二路归并排序法对该序列作升序排序时的每一趟结果。

五、算法设计题

1.以下是直接选择排序的算法,请补充完整。

- 43 -

void selectSort(list r,int n)

{//对于包含n个元素的待排序列r进行直接选择排序

for(i=1;i<=________;i++) {k=i;

for(j=i+1;j<=n;j++)if(r[j].key

2.以下对进行一趟快速排序,请补充完整。 int quickpass(list r,int h,int p)

{//对子序列r[h],r[h+1],……r[p]进行一趟快速排序,以第一个记录的键值为枢纽

i=h;j=p;x=r[i];

while(i

{while((r[j].key>=x.key)&&(i

{________;i++;

while((r[i].key<=x.key)&&(i

r[i]=________;return(i); }

3.设带头结点的单链表L,结点数据值为整型。试写出对链表L按“插入方法”排序的算法:LINSORT(L).

4.冒泡排序算法是把大的元素向上移(起泡的上浮),也可把小的元素向下移(起泡的下沉),请给出上浮和下沉过程交替的起泡排序算法。

5.一个线性表中的元素为正整数或负整数。设计一个算法,将正整数和负整数分开,使线性表前一半为负整数,后一半为正整数。不要求对这些元素排序,但要求尽量减少交换次数。 6.已知排序码序列{k1,k2,...,kn}是小顶堆,试写一算法,增加排序码x到堆中{k1,k2,...,kn,x}后,将其调整为小顶堆的算法。(排序码值为ki的记录存于r[i-1]中)

7.请用快速排序思想,设计递归算法实现求n(n>1)个不同元素集合中的第i(0

- 44 -

8、有一种简单的排序算法,叫做计数排序。这种排序算法对一个待排序的表(用数组表示)进行排序,并将排序结果存放到另一个新的表中。必须注意的是,表中所有待排序的关键字互不相同,计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字小。假设对某一个记录,统计出数值为c,那么这个记录在新的有序表中的合适的存放位置即为c。 (1)给出适用于计数排序的数据表定义。 (2)编写实现计数排序的算法。

(3)对于有n个记录的表,比较次数是多少?

(4)与简单选择排序相比,这种方法是否更好?为什么?

- 45 -