1、数据结构与算法习题册(课后部分参考答案)数据结构与算法课程组目录目录课后习题部分第一章 绪论 1第二章 线性表 .3第三章 栈和队列 .5第四章 串 8第五章 数组和广义表 10第六章 树和二叉树 .13第七章 图 16第九章 查找 20第十章 排序 23课后习题部分 第一章绪论1第一章 绪论一. 填空题1. 从逻辑关系上讲,数据结构的类型主要分为 集合 、线性结构、树结构和 图结构。2. 数据的存储结构主要有 顺序存储和 链式存储 两种基本方法,不论哪种存储结构,都要存储两方面的内容:数据元素 和 数据元素之间的关系 。3. 算法具有五个特性,分别是 有穷性 、 确定性、可行性、 输入 、
2、输出 。4. 算法设计要求中的健壮性指的是 算法在发生非法操作时可以作出处理的特性。二. 选择题1. 顺序存储结构中数据元素之间的逻辑关系是由 C 表示的,链接存储结构中的数据元素之间的逻辑关系是由 D 表示的。A 线性结构 B 非线性结构 C 存储位置 D 指针2. 假设有如下遗产继承规则:丈夫和妻子可以相互继承遗产;子女可以继承父亲或母亲的遗产;子女间不能相互继承。则表示该遗产继承关系的最合适的数据结构应该是 B 。A 树 B 图 C 线性表 D 集合3. 算法指的是 A 。A 对特定问题求解步骤的一种描述,是指令的有限序列。B 计算机程序 C 解决问题的计算方法 D 数据处理三. 简答题
3、1. 分析以下各程序段,并用大 O 记号表示其执行时间。(1) (2)i=1;k=0; i=1;k=0;While(inext =rear-next; rear-next =s; rear =s;;删除开始结点的操作顺序为 q=rear-next-next; rear-next-next=q-next; delete q; 。 二. 选择题1.数据在计算机存储器内表示时物理地址与逻辑地址相同并且是连续的,称之为: C A 存储结构 B 逻辑结构 C 顺序存储结构 D 链式存储结构2. 在 n 个结点的顺序表中,算法的时间复杂度是 O( 1)的操作是: A A 访问第 i 个结点(1in)和求第
4、 i 个结点的直接前驱(2in ) B 在第 i 个结点后插入一个新结点(1in )C 删除第 i 个结点(1in) D 将 n 个结点从小到大排序3. 线性表 L 在 B 情况下适用于使用链式结构实现。A 需经常修改 L 中的结点值 B 需不断对 L 进行删除插入C L 中含有大量的结点 D L 中结点结构复杂4. 单链表的存储密度 C A 大于 1 B 等于 1 C 小于 1 D 不能确定三. 判断题1. 线性表的逻辑顺序和存储顺序总是一致的。 F 2. 线性表的顺序存储结构优于链接存储结构。 F 3. 设 p,q 是指针,若 p=q,则*p=*q 。 F 4. 线性结构的基本特征是:每个
5、元素有且仅有一个直接前驱和一个直接后继。 F 四. 简答题1. 分析下列情况下,采用何种存储结构更好些。(1)若线性表的总长度基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素。(2)如果 n 个线性表同时并存,并且在处理过程中各表的长度会动态发生变化。(3)描述一个城市的设计和规划。课后作业部分 第二章 线性表4 应选用顺序存储结构。很少进行插入和删除操作,所以空间变化不大,且需要快速存取,所以应选用顺序存储结构。 应选用链式存储结构。链表容易实现表容量的扩充,适合表的长度动态发生变化。 应选用链式存储结构。因为一个城市的设计和规划涉及活动很多,需要经常修改、扩充和删除
6、各种信息,才能适应不断发展的需要。而顺序表的插入、删除的效率低,故不合适。五. 算法设计1. 已知数组 An中的元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为 O(n)。2. 线性表存放在整型数组 Aarrsize的前 elenum 个单元中,且递增有序。编写算法,将元素 x 插入到线性表的适当位置上,以保持线性表的有序性,并且分析算法的时间复杂度。int insert (datatype A,int *elenum,datatype x) /*设 elenum 为表的最大下标*/if (*elenum=arrsize-1) retu
7、rn 0; /*表已满,无法插入*/else i=*elenum;while (i=0 i-; Ai+1=x; /*找到的位置是插入位的下一位 */(*elenum)+;return 1; /*插入成功*/O(n)课后作业部分 第三章 栈和队列5第三章 栈和队列一. 填空题1. 设有一个空栈,栈顶指针为 1000H,现有输入序列为 1. 2. 3. 4. 5, 经过push,push,pop ,push,pop,push,push 后,输出序列是 23 ,栈顶指针为 1003H 。2. 栈通常采用的两种存储结构是 顺序栈 、 链栈 ;其判定栈空的条件分别是 TOP=-1 、 TOP=NULL
8、,判定栈满的条件分别是 TOP=数组长度 、 存储空间满 。3. 栈 可作为实现递归函数调用的一种数据结构。4. 表达式 a*(b+c)-d 的后缀表达式是 abc+*d- 。二. 选择题1. 若一个栈的输入序列是 1,2,3,n,输出序列的第一个元素是 n,则第 i 个输出元素是 D 。A 不确定 B n-i C n-i-1 D n-i+12. 设栈 S 和队列 Q 的初始状态为空,元素 e1. e2. e3. e4. e5. e6 依次通过栈 S,一个元素出栈后即进入队列 Q,若 6 个元素出队的顺序是 e2. e4. e3. e6. e5. e1,则栈 S的容量至少应该是 C 。A 6
9、B 4 C 3 D 23. 一个栈的入栈序列是 1, 2,3,4,5 ,则栈的不可能的输出序列是 C 。A 54321 B 45321 C 43512 D 12345 三. 判断题 1. 有 n 个元素依次进栈,则出栈序列有 (n-1)/2 种。 F 2. 栈可以作为实现过程调用的一种数据结构。 T 3. 在栈满的情况下不能做进栈操作,否则将产生“ 上溢”。 T 4. 在循环队列中, front 指向队头元素的前一个位置,rear 指向队尾元素的位置,则队满的条件是 front=rear。 F 四. 简答题1. 设有一个栈,元素进栈的次序为 A,B,C,D ,E,能否得到如下出栈序列,若能,请
10、写出操作序列,若不能,请说明原因。 C,E ,A , B,D C,B ,A , D,E课后作业部分 第三章 栈和队列6不能,因为在 C、E 出栈后,A 一定在栈中,而且在 B 的下面,不可能先于 B 出栈可以,设为进栈操作,为入栈操作,则其操作序列为 IIIOOOIOIO。2. 在操作序列 push(1). push(2). pop. push(5). push(7). pop. push(6)之后,栈顶元素和栈底元素分别是什么?(push(k)表示 k 入栈,pop 表示栈顶元素出栈。 )栈顶元素为 6,栈底元素为 1。3. 在操作序列 EnQueue(1). EnQueue(3). DeQ
11、ueue. EnQueue(5). EnQueue(7). DeQueue. EnQueue(9)之后,队头元素和队尾元素分别是什么?(EnQueue(k) 表示整数 k 入队,DeQueue 表示队头元素出队) 。队头元素为 5,队尾元素为 9。4. 简述以下算法的功能(栈的元素类型 SElemType 为 int) 。(1) status algo1(Stack S,int e)Stack T; int d; InitStack(T);while(!StackEmpty(S)Pop(S,d);if(d!=e) Push(T,d);while(!StackEmpty(T)Pop(T,d);
12、Push(S,d);/S 中如果存在 e,则删除它。(2) void algo2(Queue int d; InitStack(S);while(!QueueEmpty(Q)DeQueue(Q, d); Push(S, d);while(!StackEmpty(S)Pop(S, d); EnQueue(Q, d);/队列逆置课后作业部分 第三章 栈和队列7五. 算法设计1. 试写一个判别表达式中开、闭括号是否配对出现的算法BOOL BracketCorrespondency(char a)int i=0;Stack s;InitStack(s);ElemType x;while(ai)swit
13、ch(ai)case (:Push(s,ai);break;case :Push(s,ai);break;case ):GetTop(s,x);if(x=() Pop(s,x);else return FALSE;break;case :GetTop(s,x);if(x=) Pop(s,x);else return FALSE;break;default:break;i+;if(s.size!=0) return FALSE;return TRUE;2. 假设称正读和反读都相同的字符序列为“ 回文”,例如, abba和abcba是回文,abcde和ababab则不是回文。试写一个算法判别读入的
14、一个以 为结束符的字符序列是否是“ 回文 ”。Status SymmetryString(char* p)Queue q;if(!InitQueue(q) return 0;Stack s;InitStack(s);ElemType e1,e2;while(*p)Push(s,*p);EnQueue(q,*p);p+;while(!StackEmpty(s)Pop(s,e1);DeQueue(q,e2);if(e1!=e2) return FALSE;return OK;课后作业部分 第四章 串8第四章 串一. 填空题1. 不包含任何字符(长度为 0)的串 称为空串;由一个或多个空格(仅由空格
15、符)组成的串 称为空白串。2. 设 S=“A;/document/Mary.doc”,则 strlen(s)= 20 , “/”的字符定位的位置为 3 。3. 若 n 为主串长,m 为子串长,则串的经典模式匹配算法最坏的情况下需要比较字符的总次数为 (n-m+1)*m 。二. 选择题1. 串是一种特殊的线性表,其特殊性体现在: ( B )A 可以顺序存储 B 数据元素是一个字符 C 可以链式存储 D 数据元素可以是多个字符2. 设有两个串 p 和 q,求 q 在 p 中首次出现的位置的运算称作:( B )A 连接 B 模式匹配 C 求子串 D 求串长3. 设串 s1=ABCDEFG,s2=PQ
16、RST,函数 con(x,y)返回 x 和 y 串的连接串,subs(s, i, j)返回串 s 的从序号 i 开始的 j 个字符组成的子串,len(s) 返回串 s 的长度,则 con(subs(s1, 2, len(s2), subs(s1, len(s2), 2)的结果串是:( D )A BCDEF B BCDEFG C BCPQRST D BCDEFEF4. 若串 S=”software”,其子串的数目是( B ) 。 A 8 B 37 C 36 D 9三. 计算题1. 设 s=I AM A STUDENT, t=GOOD, q=WORKER, 求:1)Replace(s,STUDEN
17、T,q) 2)Concat(t,SubString(s,7,8)1、 Replace(s,STUDENT,q)I AM A WORKER2、因为 SubString(s,7,8) STUDENTConcat(t,SubString(s,7,8)GOOD STUDENT四. 算法设计1. 利用 C 的库函数 strlen, strcpy(或 strncpy)写一个算法 void StrDelete(char *S,int t,int m) ,删除串 S 中从位置 i 开始的连续的 m 个字符。若 istrlen(S),则没有字符被删除;若 i+mstrlen(S),则将 S 中从位置 i 开始直
18、至末尾的字符均被删去。提示:strlen 是求串长 (length)函数:int strlen(char s); /求串的长度课后作业部分 第四章 串9strcpy 是串复制 (copy)函数:char *strcpy(char to,char from); /该函数将串 from 复制到串 to 中,并且返回一个指向串 to 的开始处的指针。void StrDelete(char *S, int i ,int m) /串删除char TempMaxsize;/定义一个临时串if(i+m=strlen(S) /修改第 i 行最小元素的列号.for (i=0;i0)个结点的满二叉树共有 (n+1
19、)/2 个叶子结点和 (n-1)/2 个非终端结点。3. 设深度为 k 的二叉树上只有度为 0 和度为 2 的结点,该二叉树的结点数可能达到的最大值是 2k-1 ,最小值是 2k-1 。4. 深度为 k 的二叉树中,所含叶子的个数最多为 2k-1 。5. 在顺序存储的二叉树中编号为 i 和 j 的两个结点处在同一层的条件为:二. 选择题1. 前序遍历和中序遍历结果相同的二叉树是( D ) 。A 根结点无左孩子的二叉树 B 根结点无右孩子的二叉树C 所有结点只有左子树的二叉树 D 所有结点只有右子树的二叉树2. 序存储的方法将完全二叉树中的所有结点逐层存放在数组 A1 An中,结点 Ai若有左子
20、树,则左子树的根结点是( D ) 。 A A2i-1 B A2i+1 C Ai/2 D A2i3. 完全二叉树中的任一结点,若其右分支下的子孙的最大层次为 h,则其左分支下的子孙的最大层次为( C ) 。A h B h+1 C h 或 h+1 D 任意4. 在线索二叉树中,一个结点是叶子结点的充要条件为( C ) 。A 左线索标志为 0,右线索标志为 1 B 左线索标志为 1,右线索标志为 0C 左. 右线索标志均为 0 D 左. 右线索标志均为 15. 由权值为3, 8, 6, 2, 5的叶子结点生成一棵哈夫曼树,其带权路径长度为( C ) 。A 24 B 48 C 53 D 72三. 简答
21、题1. 已知二叉树的中序和后序序列分别为 CBEDAFIGH 和 CEDBIFHGA,请构造出此二叉树,并写出此树的后序遍历序列。课后作业部分 第六章 树和二叉树152. 将下图所示的树转换为二叉树,3. 图 5-17 所示的二叉树转换为树或森林4. 已知某字符串 S 中共有 8 种字符A,B,C,D,E,F,G,H,分别出现 2 次. 1 次. 4 次. 5次. 7 次. 3 次. 4 次和 9 次。1)试构造出哈夫曼编码树,并对每个字符进行编码2)问该字符串的编码至少有多少位。A:00000 B:00001 C:100 D:001 E:11 F:0001 G:101 H:01其带权路径长度
22、=25+15+34+53+92+43+43+72=98 ,所以,该字符串的编码长度至少为 98 位。四. 算法设计A BFDHC GE课后作业部分 第六章 树和二叉树161. 设计算法求二叉树的结点个数2. 以二叉链表为存储结构,编写算法求二叉树中结点 x 的双亲3. 编写算法交换二叉树中所有结点的左右子树。课后作业部分 第七章 图17第七章 图一. 填空题1. 设无向图 G 中顶点数为 n,则图 G 至少有 0 条边,至多有 n(n-1)/2 条边;若 G为有向图,则至少有 0 条边,至多有 n(n-1) 条边。2. 任何连通图的连通分量只有一个,即是 它自身 3. 若一个有向图由邻接矩阵表
23、示,则计算第 j 个顶点入度的方法是 求矩阵第 j 列元素之和4. 图的深度优先遍历类似于树的 先根 遍历,广度优先遍历类似于树的 层序 遍历。 5. 对于含有 n 个顶点 e 条边的连通图,利用 Prim 算法求最小生成树的时间复杂度为(n 2),利用 Kruskal 算法求最小生成树的时间复杂度为 (elog2e) 。二. 选择题1. 在一个无向图中,所有顶点的度数之和等于所有边数的( C )倍。A 1/2 B 1 C 2 D 42. n 个顶点的强连通图至少有( A )条边。 A n B n+1 C n-1 D n(n-1)3. 含 n 个顶点的连通图中的任意一条简单路径,其长度不可能超
24、过( C ) 。A 1 B n/2 C n-1 D n 4. 对于一个具有 n 个顶点的无向图用邻接矩阵存储,则该矩阵的大小是( D ) 。A n B (n-1)2 C n-1 D n25. 设无向图 G=(V, E)和 G =(V, E ),如果 G 是 G 的生成树,则下面的说法中错误的是( B ) 。A G 为 G 的子图 B G 为 G 的连通分量C G 为 G 的极小连通子图且 V= V D G 是 G 的一个无环子图6. 判定一个有向图是否存在回路除了可以利用拓扑排序方法外,还可以用( D ) 。A 求关键路径的方法 B 求最短路径的方法C 广度优先遍历算法 D 深度优先遍历算法7
25、. 下面关于工程计划的 AOE 网的叙述中,不正确的是( B )A 关键活动不按期完成就会影响整个工程的完成时间B 任何一个关键活动提前完成,那么整个工程将会提前完成C 所有的关键活动都提前完成,那么整个工程将会提前完成D 某些关键活动若提前完成,那么整个工程将会提前完三. 计算题1. 已知一个连通图如图所示,试给出图的邻接矩阵和邻接课后作业部分 第七章 图18表存储示意图,若从顶点 v1 出发对该图进行遍历,分别给出一个按深度优先遍历和广度优先遍历的顶点序列。邻接矩阵表示如下:深度优先遍历序列为:v1 v2 v3 v5 v4 v6广度优先遍历序列为:v1 v2 v4 v6 v3 v5邻接表表
26、示如右:2. 已知无向图 G 的邻接表如下图所示,分别写出从顶点 1 出发的深度遍历和广度遍历序列,并画出相应的生成树。深度优先遍历序列为:1,2,3,4,5 ,6对应的生成树为:广度优先遍历序列为:1,2,4,3,5 ,6对应的生成树为:3. 下图所示是一个无向带权图,请分别按 Prim 算法和 Kruskal 算法求最小生成树。课后作业部分 第七章 图194. 如右图所示的有向网图,利用 Dijkstra 算法求从顶点 v1 到其他各顶点的最短路径。从源点 v1 到其他各顶点的最短路径如下表所示。源点 终点 最短路径 最短路径长度v1 v3 v1 v3 15v1 v5 v1 v5 15v1
27、 v2 v1 v3 v2 25v1 v6 v1 v3 v2 v6 40v1 v4 v1 v3 v2 v4 455. 已知一个 AOV 网如下图所示,写出所有拓扑序列。拓扑序列为:v0 v1 v5 v2 v3 v6 v4、 v0 v1 v5 v2 v6 v3 v4、 v0 v1 v5 v6 v2 v3 v4。四. 算法设计1. 设计算法,将一个无向图的邻接表转换成邻接矩阵。课后作业部分 第七章 图202. 设计算法,计算图中出度为零的顶点个数。3. 已知一个有向图的邻接表,编写算法建立其逆邻接表课后作业部分 第九章 查找21第九章 查找一. 填空题1. 顺序查找技术适合于存储结构为 顺序和链式存
28、储 的线性表,而折半查找技术适用于存储结构为 顺序存储 的线性表,并且表中的元素必须是 按关键码有序 。2. 折半查找有序表( 4,6,12,20,28,38,50,70,88,100) ,若查找表中元素20,它将依次与表中元素 28,6,12,20 比较大小。3. 在各种查找方法中,平均查找长度与结点个数 n 无关的查找方法是 散列(哈希)查找 。4. 为了能有效地应用哈希查找技术,必须解决的两个问题是 构造散列函数 和 解决冲突。5. 有一个表长为 m 的散列表,初始状态为空,现将 n(nlchild if(T-datadata; if(T-rchild return flag; /Is_
29、BSTree 课后作业部分 第九章 查找24第十章 排序一. 填空题1. 排序的方法有很多种, 插入排序 法从未排序序列中依次取出元素,与已排序序列中的元素作比较,将其放入已排序序列的正确位置上。 选择排序 法从未排序序列中挑选元素,并将其依次放入已排序序列的一端。交换排序是对序列中元素进行一系列比较,当被比较的两元素为逆序时,进行交换; 冒泡排序 和 快速排序 是基于这类方法的两种排序方法,而 快速排序是比冒泡排序效率更高的方法; 堆排序 法是基于选择排序的一种方法,是完全二叉树结构的一个重要应用。2. 一组记录( 54, 38, 96, 23, 15, 72, 60, 45, 83)进行直
30、接插入排序,当把第 7 个记录 60 插入到有序表时,为寻找插入位置需比较 3 次。3. 对 n 个待排序记录序列进行快速排序,所需要的最好时间是 O(nlog2n),最坏时间是 O(n2) 二. 选择题1. 下列序列中, (A)是执行第一趟快速排序的结果。A da, ax,eb,de,bb ff ha,gc B cd,eb,ax ,da ff ha,gc,bbC gc,ax,eb,cd ,bb ff da,ha D ax,bb,cd,da ff eb,gc,ha2. 堆的形状是一棵( C) 。A 二叉排序树 B 满二叉树 C 完全二叉树 D 判定树3. 希望用最快的速度从 5000 个元素挑
31、选出前 10 个最大的,采用( B )方法最好。A 快速排序 B 堆排序 C 希尔排序 D 归并排序4. 设要将序列( Q,H,C ,Y,P,A ,M ,S ,R,D,F,X)中的关键码按升序排列,则( D )是起泡排序一趟扫描的结果, ( B )是增量为 4 的希尔排序一趟扫描的结果, ( E )二路归并排序一趟扫描的结果, ( A )是以第一个元素为轴值的快速排序一趟扫描的结果, ( C )是堆排序初始建堆的结果。A(F,H,C,D,P,A,M ,Q,R,S ,Y,X ) B(P,A,C,S,Q,D, F,X,R,H ,M ,Y ) C(A,D,C,R,F,Q,M,S,Y,P ,H,X)
32、D(H,C,Q,P,A,M,S ,R,D,F ,X ,Y) E(H,Q ,C,Y,A ,P, M,S,D ,R,F ,X )5. 下述几种排序方法中,要求内存最小的是(AD )A 插入排序 B 快速排序 C 堆排序 D 选择排序三. 简答题1. 已知数据序列为 (12,5,9,20,6,31,24) ,对该数据序列进行排序,写出插入课后作业部分 第九章 查找25排序. 起泡排序. 快速排序. 简单选择排序以及二路归并排序每趟的结果。2. 判别下列序列是否为堆,如不是,按照堆排序思想把它调整为堆,用图表示建堆的过程。(1,5,7, 25,21,8,8,42)(3,9,5, 8,4,17,21,6)【解答】序列是堆,序列不是堆,调整为堆(假设为大根堆)的过程如下图所示。课后作业部分 第九章 查找26四. 算法设计1. 直接插入排序中寻找插入位置的操作可以通过折半查找来实现。据此写一个改进的插入排序的算法。#region 折半插入排序算法void HalfInsertSort(int array)for(int i=2;i= high + 1; -j)arrayj + 1 = arrayj;arrayj + 1 = array0;#endregion2. 已知(k 1, k2, , kn)是堆,试写一算法将(k 1, k2, , kn, kn+1)调整为堆