数据结构第五章图习题教学文案
- 格式:doc
- 大小:273.50 KB
- 文档页数:7
《数据结构》课程教案一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到对数据的组织、存储和访问方法的研究。
数据结构的学习能够帮助学生建立起对计算机中数据处理的基本概念和方法的理解,并培养学生分析和解决实际问题的能力。
本教案旨在为《数据结构》课程提供一套系统的教学计划,以确保学生能够全面掌握该学科的知识和技能。
二、教学目标本课程的主要教学目标如下:1. 掌握常见的数据结构,包括线性表、栈、队列、树、图等,并理解它们的基本概念与特点;2. 理解各种数据结构之间的联系与区别,能够根据问题需求选择合适的数据结构;3. 学习并掌握常用的数据结构算法,如查找、排序等;4. 培养学生分析和解决实际问题的能力,提高编程实践的能力;5. 增强学生的团队合作与沟通能力,通过小组项目实践提升学生能力。
三、教学内容与安排本课程的教学内容将按照以下顺序进行讲解和实践操作:第一章:绪论1. 数据结构的基本概念与作用;2. 学习数据结构的意义与价值;3. 课程的教学方法和学习要求。
第二章:线性表1. 线性表的定义与分类;2. 线性表的顺序存储结构与链式存储结构;3. 线性表的基本运算和实例分析。
第三章:栈与队列1. 栈的定义与基本操作;2. 栈的应用场景与实例分析;3. 队列的定义与基本操作;4. 队列的应用场景与实例分析。
第四章:树与二叉树1. 树的定义与基本术语;2. 二叉树的定义与性质;3. 二叉树的遍历方法与实例分析;4. 哈夫曼树的构建与应用。
第五章:图1. 图的定义与基本术语;2. 图的存储方式与基本操作;3. 图的遍历算法与实例分析;4. 最短路径算法与实例分析。
第六章:查找算法1. 顺序查找与二分查找;2. 哈希查找的原理与实现方法。
第七章:排序算法1. 冒泡排序与插入排序;2. 快速排序与归并排序;3. 堆排序与希尔排序。
第八章:课程总结与展望1. 对整个课程内容的回顾;2. 对数据结构的进一步学习与应用的展望;3. 学生反馈与教师建议。
第五章树课后习题讲解一、选择题⑴如果结点A有3个兄弟,B是A的双亲,则结点B的度是()。
A 1B 2C 3D 4【解答】D⑵设二叉树有n个结点,则其深度为()。
A n-1B nC +1D 不能确定【解答】D【分析】此题并没有指明是完全二叉树,则其深度最多是n,最少是 +1。
⑶二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。
A 空或只有一个结点B 高度等于其结点数C 任一结点无左孩子D 任一结点无右孩子【解答】B【分析】此题注意是序列正好相反,则左斜树和右斜树均满足条件。
⑷线索二叉树中某结点R没有左孩子的充要条件是()。
A R.lchild=NULLB R.ltag=0C R.ltag=1D R.rchild=NULL【解答】C【分析】线索二叉树中某结点是否有左孩子,不能通过左指针域是否为空来判断,而要判断左标志是否为1。
⑸深度为k的完全二叉树至少有()个结点,至多有()个结点,具有n个结点的完全二叉树按层序从1开始编号,则编号最小的叶子的序号是()。
A 2k-2+1B 2k-1C 2k -1 -1D 2k-1E 2k+1F 2k+1 -1G 2k -1+1H 2k【解答】B,C,A【分析】深度为k的完全二叉树最少结点数的情况应是第k层上只有1个结点,最多的情况是满二叉树,编号最小的叶子应该是在结点数最少的情况下,叶子结点的编号。
⑹一个高度为h的满二叉树共有n个结点,其中有m个叶子结点,则有()成立。
A n=h+mB h+m=2nC m=h-1D n=2m-1【解答】D【分析】满二叉树中没有度为1的结点,所以有m个叶子结点,则度为2的结点个数为m-1。
⑺任何一棵二叉树的叶子结点在前序、中序、后序遍历序列中的相对次序()。
A 肯定不发生改变B 肯定发生改变C 不能确定D 有时发生变化【解答】A【分析】三种遍历次序均是先左子树后右子树。
⑻如果T' 是由有序树T转换而来的二叉树,那么T中结点的前序序列就是T' 中结点的()序列,T中结点的后序序列就是 T' 中结点的()序列。
第五章数组与广义表一、假设有二维数组A6*8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A的起始存储位置(基地址)为1000。
计算:1、数组A的体积(即存储量);2、数组A的最后一个元素a57的第一个字节的地址;3、按行存储时,元素a14的第一个字节的地址;4、按列存储时,元素a47的第一个字节的地址;答案:1、(6*8)*6=2882、loc(a57)=1000+(5*8+7)*6=1282或=1000+(288-6)=12823、loc(a14)=1000+(1*8+4)*6=10724、loc(a47)=1000+(7*6+4)*6=1276二、假设按低下标(行优先)优先存储整数数组A9*3*5*8时第一个元素的字节地址是100,每个整数占四个字节。
问下列元素的存储地址是什么?(1)a0000(2)a1111(3)a3125 (4)a8247答案:(1)100(2)loc(a1111)=100+(1*3*5*8+1*5*8+1*8+1)*4=776(3) loc(a3125)=100+(3*3*5*8+1*5*8+2*8+5)*4=1784(4) loc(a8247)=100+(8*3*5*8+2*5*8+4*8+7)*4=4416五、设有一个上三角矩阵(aij)n*n,将其上三角元素逐行存于数组B[m]中,(m 充分大),使得B[k]=aij且k=f1(i)+f2(j)+c。
试推导出函数f1,f2和常数C(要求f1和f2中不含常数项)。
答:K=n+(n-1)+(n-2)+…..+(n-(i-1)+1)+j-i=(i-1)(n+(n-i+2))/2+j-i所以f1(i)=(n+1/2)i-1/2i2f2(j)=jc=-(n+1)九、已知A为稀疏矩阵,试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成∑aii运算的优缺点。
(对角线求和)解:1、二维数组For(i=1;i<=n;i++)S=s+a[i][i];时间复杂度:O(n)2、for(i=1;i<=m.tu;i++)If(a.data[k].i==a.data[k].j) s=s+a.data[k].value;时间复杂度:O(n2)二十一、当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。
第五章习题5.1 假设有6行8列的二维数组A,每个元素占用6个字节,存储器按字节编址。
已知A的基地址为1000,计算:数组A共占用多少字节;数组A的最后一个元素的地址;按行存储时元素A36的地址;按列存储时元素A36的地址;5.2 设有三对角矩阵An×n ,将其三条对角线上的元素逐行地存于数组B(1:3n-2)中,使得B[k]= aij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i,j的下标变换公式。
5.3假设稀疏矩阵A和B均以三元组表作为存储结构。
试写出矩阵相加的算法,另设三元组表C存放结果矩阵。
5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。
5.5写一个在十字链表中删除非零元素aij的算法。
5.6画出下面广义表的两种存储结构图示:((((a), b)), ((( ), d), (e, f)))5.7求下列广义表运算的结果:(1)HEAD[((a,b),(c,d))];(2)TAIL[((a,b),(c,d))];(3)TAIL[HEAD[((a,b),(c,d))]];(4)HEAD[TAIL[HEAD[((a,b),(c,d))]]];(5)TAIL[HEAD[TAIL[((a,b),(c,d))]]];实习题若矩阵Am×n 中的某个元素aij是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。
假设以二维数组存储矩阵,试编写算法求出矩阵中的所有马鞍点。
第五章答案5.2设有三对角矩阵A n×n,将其三条对角线上的元素逐行的存于数组B[1..3n-2]中,使得B[k]=a ij,求:(1)用i,j表示k的下标变换公式;(2)用k表示i、j的下标变换公式。
【解答】(1)k=2(i-1)+j(2) i=[k/3]+1, j=[k/3]+k%3 ([ ]取整,%取余)5.4在稀疏矩阵的快速转置算法5.2中,将计算position[col]的方法稍加改动,使算法只占用一个辅助向量空间。
1、特殊矩阵和稀疏矩阵哪一种压缩存储后会失去随机存取的功能?为什么?答:后者在采用压缩存储后将会失去随机存储的功能。
因为在这种矩阵中,非零元素的分布是没有规律的,为了压缩存储,就将每一个非零元素的值和它所在的行、列号作为一个结点存放在一起,这样的结点组成的线性表中叫三元组表,它已不是简单的向量,所以无法用下标直接存取矩阵中的元素。
2、二维数组M的元素是4个字符(每个字符占一个存储单元)组成的串,行下标i的范围从0到4,列下标j的范围从0到5,M按行存储时元素M[3][5]的起始地址与M按列存储时元素()的起始地址相同。
A、M[2][4]B、M[3][4]C、M[3][5]D、M[4][4]为第3、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11的地址为()。
一元素,其存储地址为1,每个元素占一个地址空间,则a85A. 13B. 33C. 18D. 404、若对n阶对称矩阵A以行序为主序方式将其下三角形的元素(包括主对角线(i<j)上所有元素)依次存放于一维数组B[1..(n(n+1))/2]中,则在B中确定aij的位置k的关系为( )。
A. i*(i-1)/2+jB. j*(j-1)/2+iC. i*(i+1)/2+jD. j*(j+1)/2+i5、设A是n*n的对称矩阵,将A的对角线及对角线上方的元素以列为主的次序(1≤i,j≤n,且i≤j)存放在一维数组B[1..n(n+1)/2]中,对上述任一元素aij在B中的位置为( )。
A. i(i-l)/2+jB. j(j-l)/2+iC. j(j-l)/2+i-1D. i(i-l)/2+j-16、设二维数组A[1.. m,1.. n](即m行n列)按行存储在数组B[1.. m*n]中,则二维数组元素A[i,j]在一维数组B中的下标为( )。
A.(i-1)*n+jB.(i-1)*n+j-1C. i*(j-1)D. j*m+i-17、有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()。
05 图【单选题】1. 设无向图G 中有五个顶点,各顶点的度分别为2、4、3、1、2,则G 中边数为(C )。
A、4条 B、5条 C、6条 D、无法确定2. 含n 个顶点的无向完全图有(D )条边;含n 个顶点的有向图最多有(C )条弧;含n 个顶点的有向强连通图最多有(C )条弧;含n 个顶点的有向强连通图最少有(F)条弧;设无向图中有n 个顶点,则要接通全部顶点至少需(G )条边。
A 、n 2B 、n(n+1)C 、n(n-1)D 、n(n-1)/2E 、n+1F 、nG 、n-13. 对下图从顶点a 出发进行深度优先遍历,则(A )是可能得到的遍历序列。
A 、acfgdebB 、abcdefgC 、acdgbefD 、abefgcd对下图从顶点a 出发进行广度优先遍历,则(D )是不可能得到的遍历序列。
A 、abcdefgB 、acdbfgeC 、abdcegfD 、adcbgef4. 设图G 的邻接矩阵A=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡010101010,则G 中共有(C )个顶点;若G 为有向图,则G 中共有(D )条弧;若G 为无向图,则G 中共有(B )条边。
A 、1B 、2C 、3D 、4E 、5F 、9G 、以上答案都不对5. 含n 个顶点的图,最少有(B )个连通分量,最多有(D )个连通分量。
A 、0B 、1C 、n-1D 、n6. 用邻接表存储图所用的空间大小(A )。
A 、与图的顶点数和边数都有关B 、只与图的边数有关C 、只与图的顶点数有关D 、与边数的平方有关7. n 个顶点的无向图的邻接表最多有(B )个表结点。
A 、n 2B 、n(n-1)C 、n(n+1)D 、n(n-1)/28. 无向图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)},对该图进行深度优先遍历,得到的顶点序列正确的是(D )。
A 、a,b,e,c,d,fB 、a,c,f,e,b,dC 、a,e,b,c,f,dD 、a,e,d,f,c,b9. 图的BFS 生成树的树高比DFS 生成树的树高(A )。
A 、小或相等B 、小C 、大或相等D 、大10. 下列不正确的是(C)。
(1)求从指定源点到其余各顶点的迪杰斯特拉(Dijkstra)最短路径算法中弧上权不能为负的原因是在实际应用中无意义;(2)利用Dijkstra求每一对不同顶点之间的最短路径的算法时间是O(n3);(图用邻接矩阵表示)(3)Floyd求每对不同顶点对的算法中允许弧上的权为负,但不能有权和为负的回路。
A、(1),(2),(3)B、(1)C、(1),(3)D、(2),(3)11. 当各边上的权值(A)时,BFS算法可用来解决单源最短路径问题。
A、均相等B、均互不相等C、不一定相等12. 若一个有向图具有拓扑排序序列,那么它的邻接矩阵必定为(C)。
A、对称矩阵B、稀疏矩阵C、三角矩阵D、一般矩阵13. 在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前,则下列情形不可能出现的是(D)。
A、G中有弧<Vi,Vj>B、G中有一条从Vi到Vj的路径C、G中没有弧<Vi,Vj>D、G中有一条从Vj到Vi的路径14. 关键路径是AOE网中(B)。
A、从始点到终点的最短路径B、从始点到终点的最长路径C、人始点到终点的边数最多的路径D、从始点到终点的边数最少的路径15. 下面关于求关键路径的说法不正确的是(C)。
A、求关键路径是以拓扑排序为基础的B、一个事件的最早开始时间同以该事件为尾的弧的活动最早开始时间相同C、一个事件的最迟开始时间为以该事件为尾的弧的活动最迟开始时间与该活动的持续时间的差D、关键活动一定位于关键路径上【填空题】1. 设无向连通图G含n个顶点e条边,则G的生成树含个顶点条边。
2. 连通分量是无向图的子图,生成树是无向连通图的子图。
3. 对稀疏图而言,在邻接矩阵和邻接表这两种存储结构中选择更为适宜。
4. 设无向图G含n个顶点e条边,则G的邻接表表示中含个边表结点。
5. 设有向图G含n个顶点e条弧,则G的邻接表表示中含个边表结点。
【计算题】1. 设无向图如下,写出对该图从顶点a 出发进行广度优先遍历可能得到的所有遍历序列。
解:abcdefg 、abdcegf 、acbdfeg 、acdbfge 、adbcgef 、adcbgfe 。
2. 设有向图如下,写出对该图从顶点a 出发进行深度优先遍历可能得到的所有遍历序列。
解:abedc 、acbed 、acdbe 。
3. 设无向网如下,(1)写出其邻接矩阵;(2)基于该邻接矩阵求深度优先生成树和广度优先生成树;(3)基于该邻接矩阵按普里姆算法求最小生成树;(4)写出其邻接表;(5)基于该邻接表按克鲁斯卡尔算法求最小生成树。
解:(1) ⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞6456252363794567555553955434 (2)深度优先生成树:;广度优先生成树:(3)最小生成树:;求解过程:(4)邻接表:(5)最小生成树:4. 设AOV图如下,写出对该图进行拓扑排序可能得到的所有拓扑序列。
解:abcdefg、abcdfeg、abcfdeg5. 设AOE网如下,试求关键路径。
解:关键路径1:v1→v2→v5→v7关键路径2:v1→v3→v6→v7。
6. 设有向网如下,试用迪杰斯特拉算法求从顶点A出发到其余各顶点的最短路径。
解:ab:3af:5afe:7abc:11afed:147. 设有向网如下,试用弗洛伊德算法求图中各对顶点间的最短路径。
解:【算法题】下列算法题中可能用到的类如下:public class MGraph{private Object vexs[];private int adj[][];private int vexnum;private int arcnum;public MGraph(int maxvn){int i, j;vexs=new Object[maxvn];adj=new int[maxvn][maxvn];for(i=0;i<maxvn;i++)for(j=0;j<maxvn;j++)adj[i][j]=0;vexnum=0;arcnum=0;}//构造函数}//图的邻接矩阵存储结构类public class ALANode{public int adj;public ALANode next;}//图的邻接表存储结构中的表结点类public class ALVNode{public Object data; //顶点信息public ALANode firstarc;}//图的邻接表存储结构中的头结点类public class ALGraph{private ALVNode vexs[];private int vexnum;private int arcnum;public ALGraph(int maxvn){vexs=new ALVNode[maxvn];vexnum=0;arcnum=0;}//构造函数}//图的邻接表存储结构类1. 在ALGraph类中添加符合如下要求的构造函数⑴public ALGraph(Object[ ] v, ArcArray [ ] a)其中v为顶点向量,a为弧向量,类ArcArray的定义如下:public class ArcArray{private int index1; //弧尾顶点下标private int index2; //弧头顶点下标}(2)public ALGraph(MGraph g)2. 在ALGraph类中添加实现如下功能的方法:(1)在无向图中插入一个顶点;(2)在无向图中删除一个顶点;(3)在无向图中添加一条边;(4)在无向图中删除一条边。
(5)判定无向图中是否存在从顶点v i到顶点v j的路径(i≠j)。
(6)输出无向图中从顶点v i到顶点v j的所有简单路径。
解:(5)public boolean path(int i, int j){//从顶点v i出发进行深度优先遍历,调用完成时所有与v i有路径相通的顶点都被访问到boolean visited[ ]=new boolean[vexs.length];for(k=0;k<vexnum;k++) visited[k]=false;dfs(i, visited);return visited[j];}//pathvoid dfs(int i, boolean[ ] visited){//从顶点v i出发对图G进行深度优先遍历visited[i]=true;for(p=vexs[i].firstarc;p;p=p.next)if (!visited[p.adj]) dfs(p.adj, visited);}//dfs3. 在MGraph类中添加符合如下要求的构造函数:(1)public class MGraph(Object[ ] v, EdgeArray [ ] e)其中v为顶点向量,e为边向量,类EdgeArray的定义如下:public class EdgeArray{public int index1; //顶点1下标public int index2; //顶点2下标}(2)public MGraph(ALGraph g)4. 在MGraph类中添加实现如下功能的方法:(1)在有向图中插入一个顶点;(2)在有向图中删除一个顶点;(3)在有向图中添加一条边;(4)在有向图中删除一条边。
(5)判定有向图中从顶点v i到顶点v j是否存在一条长为k的简单路径。