2+二+图与遍历算法+习题参考答案
深度优先遍历例题

深度优先遍历例题摘要:一、深度优先遍历概念介绍1.定义2.特点二、深度优先遍历算法应用1.图形遍历2.搜索算法三、深度优先遍历例题解析1.题目一:二叉树的深度优先遍历1.分析2.算法实现3.答案解析2.题目二:链式广度优先遍历1.分析2.算法实现3.答案解析四、深度优先遍历实战技巧与优化1.避免回溯2.提高效率正文:一、深度优先遍历概念介绍1.定义深度优先遍历(Depth-First Traversal,简称DFT)是一种遍历树或图的算法。
它沿着一个路径一直向前,直到达到最深的节点,然后回溯到上一个节点,继续沿着另一个路径遍历。
2.特点深度优先遍历的特点是访问一个节点后,会沿着该节点的子节点继续遍历,直到没有未访问的子节点为止。
此时,遍历过程会回溯到上一个节点,继续访问其未访问的子节点。
二、深度优先遍历算法应用1.图形遍历深度优先遍历在图形处理领域有广泛应用,如图像处理中的边缘检测、图像分割等。
通过遍历图像像素点,可以发现像素点之间的关系,从而实现图像处理任务。
2.搜索算法深度优先搜索(DFS)是一种经典的搜索算法,它采用深度优先策略在树或图中寻找目标节点。
DFS算法常用于解决迷宫问题、八皇后问题等。
三、深度优先遍历例题解析1.题目一:二叉树的深度优先遍历1.分析二叉树的深度优先遍历通常采用递归或栈实现。
递归方法简单,但效率较低;栈方法效率较高,但实现较复杂。
2.算法实现(递归)```def dfs(root):if not root:returnprint(root.val, end=" ")dfs(root.left)dfs(root.right)```3.答案解析按照题目给定的二叉树,进行深度优先遍历,得到的序列为:1 2 4 5 3 6 8。
2.题目二:链式广度优先遍历1.分析链式广度优先遍历与树的同层遍历类似,采用队列实现。
队列中的元素依次为当前层的节点,每次遍历时,取出队首节点,将其相邻节点加入队列,并将其标记为已访问。
数据结构习题二答案

数据结构习题二答案问题一:链表的基本操作链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。
链表的基本操作包括:1. 创建节点:定义一个节点类,包含数据域和指向下一个节点的指针域。
2. 插入操作:在链表的指定位置插入一个新的节点。
3. 删除操作:删除链表中的指定节点。
4. 遍历操作:从头节点开始,依次访问链表中的每个节点。
问题二:二叉树的遍历二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点。
二叉树的遍历方式有:1. 前序遍历:首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。
2. 中序遍历:首先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
3. 后序遍历:首先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。
问题三:图的表示图是一种复杂的非线性数据结构,由顶点和边组成。
图的表示方法有:1. 邻接矩阵:使用一个二维数组来表示图,其中矩阵的元素表示两个顶点之间的边是否存在。
2. 邻接表:使用链表来表示每个顶点的邻接顶点。
问题四:排序算法排序算法是将一组数据按照特定顺序重新排列的过程。
常见的排序算法包括:1. 冒泡排序:通过重复遍历待排序的数列,比较每对相邻元素的大小,并在必要时交换它们的位置。
2. 选择排序:从未排序序列中找到最小(或最大)的元素,存放到排序序列的起始位置,然后从剩余未排序元素中继续寻找最小(或最大)元素,以此类推。
3. 快速排序:选择一个元素作为“基准”,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再递归地对这两部分数据分别进行快速排序。
总结数据结构习题二涵盖了链表、二叉树、图和排序算法等基本概念和操作。
掌握这些基础知识对于深入理解计算机科学和进行高效的程序设计至关重要。
希望以上答案能够帮助你更好地理解和应用这些概念。
请注意,这只是一个示例答案,具体的习题答案需要根据实际的习题内容来编写。
二叉树的遍历题目及答案

二叉树的遍历题目及答案1. 二叉树的基本组成部分是:根(N)、左子树(L)和右子树(R)。
因而二叉树的遍历次序有六种。
最常用的是三种:前序法(即按N L R次序),后序法(即按L R N 次序)和中序法(也称对称序法,即按L N R次序)。
这三种方法相互之间有关联。
若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则它的后序序列必是 F E G H D C B 。
解:法1:先由已知条件画图,再后序遍历得到结果;法2:不画图也能快速得出后序序列,只要找到根的位置特征。
由前序先确定root,由中序先确定左子树。
例如,前序遍历BEFCGDH中,根结点在最前面,是B;则后序遍历中B一定在最后面。
法3:递归计算。
如B在前序序列中第一,中序中在中间(可知左右子树上有哪些元素),则在后序中必为最后。
如法对B的左右子树同样处理,则问题得解。
2.给定二叉树的两种遍历序列,分别是:前序遍历序列:D,A,C,E,B,H,F,G,I;中序遍历序列:D,C,B,E,H,A,G,I,F,试画出二叉树B,并简述由任意二叉树B的前序遍历序列和中序遍历序列求二叉树B的思想方法。
解:方法是:由前序先确定root,由中序可确定root的左、右子树。
然后由其左子树的元素集合和右子树的集合对应前序遍历序列中的元素集合,可继续确定root的左右孩子。
将他们分别作为新的root,不断递归,则所有元素都将被唯一确定,问题得解。
3、当一棵二叉树的前序序列和中序序列分别是HGEDBFCA和EGBDHFAC时,其后序序列必是A. BDEAGFHCB. EBDGACFHC. HGFEDCBAD. HFGDEABC答案:B4. 已知一棵二叉树的前序遍历为ABDECF,中序遍历为DBEAFC,则对该树进行后序遍历得到的序列为______。
A.DEBAFCB.DEFBCAC.DEBCFAD.DEBFCA[解析] 由二叉树前序遍历序列和中序遍历序列可以唯一确定一棵二叉树。
计算机二级数据结构与算法答案

第一章数据结构与算法一、选择题:1、栈和队列的共同特点是()A、都是先进先出B、都是后进先出C、只允许在端点处插入和删除数据D、没有共同点2、已知二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是()A、acbedB、decabC、debacD、cedba3、下面叙述正确的是()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、8B、16C、128D、25610、若一棵二叉树中只有叶结点和左右子树皆非空的结点,设叶结点的个数为k,则左右子树皆非空的结点个数是()A、2kB、k-1C、2k-1D、2k-111、设无向树T有7片树叶,其余顶点数均为3,则T中3度顶点的个数为()A、3B、4C、5D、612、已知一棵二叉树前序遍历和中序遍历分别为ABDEGCFH 和DBGEACHF,则该二叉树的后序遍历为()A、GEDHFBCAB、DGEBFCAC、ABCDEFGHD、ACBFEDHG13、树是结点的集合,它的根结点数目是()A、有且只有1个B、1个或多于1个C、0个或1个D、至少2个14、下列叙述中正确的是()A\线性表是线性结构B、栈和队列是非线性结构C、线性链表是非线性结构D、二叉树是线性结构15、堆栈存储器存取数据的方式是()A、先进先出B、随机存取C\先进后出D、不同于前三种方式16、如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是()A、e3,e1,e4,e2B、e4,e3,e2,e1C、e3,e4,e1,e2D、任意顺序17、在设计程序时应采用的原则之一是()A、不限制goto语句的使用B、减少或取消注释行C、程序越短越好D、程序结构应助于读者理解18、下面关于完全二叉树的叙述中,错误的是()A、除了最后一层外,每一层上的结点数均达到最大值B、可能缺少若干个左右叶子结点C、完全二叉树一般不是满二叉树D、具有几个结点的完全二叉树的深度为log2n+119、下列关于栈的叙述中正确的是()A、在栈中只能插入数据B、在栈中只能删除数据C、栈是先进先出的线性别D、栈是先进后出的线性表20、在深度为5的满二叉树中,叶子结点的个数为()A、32B、31C、16D、1521、一个算法应该具有“确定性”等五个特性,下面对另外四个特性的描述中错误的是()A、有零个或多个输入B、有零个或多个输出C、有穷形D、可行性22、若想将数据序列使用插入排序算法由小到大排序,则每次放到有序子列合适位置上的元素,应从无序序列中选择()A、固定位置的B、最小的C、任意的D、最大的23、算法的空间复杂度是指()A、算法程序的长度B、算法程序中的指令条数C、算法程序所占的存储空间D、执行过程中所需要的存储空间24、用链表表示线性表的优点是()A、便于随机存取B、花费的存储空间较顺序存储少C、便于插入和删除操作D、数据元素的物理顺序与逻辑顺序相同25、链表不具备的特点是()A、可随机访问任意一个结点B、插入和删除不需要移动任何元素C、不必事先估计存储空间D、所需空间与其长度成正比26、数据结构中,与所使用的计算机无关的是数据的()A、存储结构B、物理结构C、逻辑结构D、物理与逻辑结构27、希尔排序法属于()类型的排序法。
数据结构与算法题库(附参考答案)

数据结构与算法题库(附参考答案)一、单选题(共86题,每题1分,共86分)1.在快速排序的一趟划分过程中,当遇到与基准数相等的元素时,如果左右指针都不停止移动,那么当所有元素都相等时,算法的时间复杂度是多少?A、O(NlogN)B、O(N)C、O(N2)D、O(logN)正确答案:C2.一棵有 1001 个结点的完全二叉树,其叶子结点数为▁▁▁▁▁ 。
A、254B、250C、501D、500正确答案:C3.对于一个具有N个顶点的无向图,若采用邻接矩阵表示,则该矩阵的大小是:A、(N−1)2B、NC、N2D、N−1正确答案:C4.在有n(>1)个元素的最大堆(大根堆)中,最小元的数组下标可以是:A、⌊n/2⌋−1B、⌊n/2⌋+2C、1D、⌊n/2⌋正确答案:B5.一棵非空二叉树,若先序遍历与中序遍历的序列相同,则该二叉树▁▁▁▁▁ 。
A、所有结点均无左孩子B、所有结点均无右孩子C、只有一个叶子结点D、为任意二叉树正确答案:A6.度量结果集相关性时,如果准确率很高而召回率很低,则说明:A、大部分检索出的文件都是相关的,但还有很多相关文件没有被检索出来B、大部分相关文件被检索到,但基准数据集不够大C、大部分检索出的文件都是相关的,但基准数据集不够大D、大部分相关文件被检索到,但很多不相关的文件也在检索结果里正确答案:A7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。
则采用哪种存储方式最节省运算时间?A、单循环链表B、带头结点的双循环链表C、单链表D、双链表正确答案:B8.设数组 S[ ]={93, 946, 372, 9, 146, 151, 301, 485, 236, 327, 43, 892},采用最低位优先(LSD)基数排序将 S 排列成升序序列。
第1 趟分配、收集后,元素 372 之前、之后紧邻的元素分别是:A、43,892B、236,301C、301,892D、485,301正确答案:C9.在快速排序的一趟划分过程中,当遇到与基准数相等的元素时,如果左指针停止移动,而右指针在同样情况下却不停止移动,那么当所有元素都相等时,算法的时间复杂度是多少?A、O(NlogN)B、O(N2)C、O(N)D、O(logN)正确答案:B10.在快速排序的一趟划分过程中,当遇到与基准数相等的元素时,如果左右指针都会停止移动,那么当所有元素都相等时,算法的时间复杂度是多少?A、O(NlogN)B、O(N)C、O(logN)D、O(N2)正确答案:A11.如果AVL树的深度为6(空树的深度定义为−1),则此树最少有多少个结点?A、12B、20C、33D、64正确答案:C12.已知指针ha和hb分别是两个单链表的头指针,下列算法将这两个链表首尾相连在一起,并形成一个循环链表(即ha的最后一个结点链接hb 的第一个结点,hb的最后一个结点指向ha),返回ha作为该循环链表的头指针。
2 二 图与遍历算法 习题参考答案

第二章部分习题参考答案1.证明下列结论:1)在一个无向图中,如果每个顶点的度大于等于2,则该该图一定含有圈; 2)在一个有向图D 中,如果每个顶点的出度都大于等于1,则该图一定含有一个有向圈。
1)证明:设无向图最长的迹,10k V V V P =每个顶点度大于等于2,故存在与1V 相异的点'V 与0V 相邻,若,'P V ∉则得到比P 更长的迹,与P 的取法矛盾。
因此,P V ∈',是闭迹,从而存在圈.0'10V V V V证明*:设在无向图G 中,有n 个顶点,m 条边。
由题意知,m>=(2n)/2=n ,而一个含有n 个顶点的树有n-1条边。
因m>=n>n-1,故该图一定含有圈。
(定义:迹是指边不重复的途径,而顶点不重复的途径称为路。
起点和终点重合的途径称为闭途径,起点和终点重合的迹称为闭迹,顶点不重复的闭迹称为圈。
)2)证明:设有向图最长的有向迹,10k V V V P =每个顶点出度大于等于1,故存在'V 为k V 的出度连接点,使得'V V k 成为一条有向边,若,'P V ∉则得到比P 更长的有向迹,与P 矛盾,因此必有P V ∈',从而该图一定含有有向圈。
2.设D 是至少有三个顶点的连通有向图。
如果D 中包含有向的Euler 环游(即是通过D 中每条有向边恰好一次的闭迹),则D 中每一顶点的出度和入度相等。
反之,如果D 中每一顶点的出度与入度都相等,则D 一定包含有向的Euler 环游。
这两个结论是正确的吗?请说明理由。
如果G 是至少有三个顶点的无向图,则G 包含Euler 环游的条件是什么?证明:1)若图D 中包含有向Euler 环游,下证明每个顶点的入度和出度相等。
如果该有向图含有Euler 环游,那么该环游必经过每个顶点至少一次,每经过一次,必为“进”一次接着“出”一次,从而入度等于出度。
从而,对于任意顶点,不管该环游经过该顶点多少次,必有入度等于出度。
图练习与答案

一、应用题1. 首先将如下图所示的无向图给出其存储结构的邻接链表表示,然后写出对其分别进行深度,广度优先遍历的结果。
1题图答.深度优先遍历序列:4宽度优先遍历序列:9 & 注:(1)邻接表不唯一,这里顶点的邻接点按升序排列(2)在邻接表确定后,深度优先和宽度优先遍历序列唯一 (3)这里的遍历,均从顶点1开始 2.给出图G :(1).画出G 的邻接表表示图; (2).根据你画出的邻接表,以顶点①为根,画出G 的深度优先生成树和广度优先生成树。
~(3)宽度优先生成树~3.在什么情况下,Prim 算法与Kruskual 算法生成不同的MST答.在有相同权值边时生成不同的MST ,在这种情况下,用Prim 或Kruskal 也会生成不(同的MST4.已知一个无向图如下图所示,要求分别用Prim 和Kruskal 算法生成最小树(假设以①为起点,试画出构造过程)。
》答.Prim 算法构造最小生成树的步骤如24题所示,为节省篇幅,这里仅用Kruskal 算法,构造最小生成树过程如下:(下图也可选(2,4)代替(3,4),(5,6)代替(1,5)) !5.G=(V,E)是一个带有权的连通图,则:(1).请回答什么是G 的最小生成树; (2).G 为下图所示,请找出G 的所有最小生成树。
28题图:答.(1)最小生成树的定义见上面26题(2)最小生成树有两棵。
(限于篇幅,下面的生成树只给出顶点集合和边集合,边以三元组(Vi,Vj,W )形式),其中W 代表权值。
V (G )={1,2,3,4,5} E1(G)={(4,5,2),(2,5,4),(2,3,5),(1,2,7)};E2(G)={(4,5,2),(2,4,4),(2,3,5),(1,2,7)}6.请看下边的无向加权图。
(1).写出它的邻接矩阵。
(2).按Prim 算法求其最小生成树,并给出构造最小生成树过程中辅助数组的各分量值。
辅助数组内各分量值:/)7.已知世界六大城市为:北京(Pe)、纽约(N)、巴黎(Pa)、伦敦(L) 、东京(T) 、墨西哥(M),下表给定了这六大城市之间的交通里程:世界六大城市交通里程表(单位:百公里)](1).画出这六大城市的交通网络图;(2).画出该图的邻接表表示法;(3).画出该图按权值递增的顺序来构造的最小(代价)生成树.8.已知顶点1-6和输入边与权值的序列(如右图所示):每行三个数表示一条边的两个端点和其权值,共11行。
图论参考答案

图论参考答案图论参考答案图论作为一门数学分支,研究的是图的性质与关系。
图由节点(顶点)和连接节点的边组成,它可以用来解决许多实际问题,如网络规划、社交网络分析等。
本文将从图的基本概念、图的表示方法、图的遍历算法以及图的应用等方面进行探讨。
一、图的基本概念图由节点和边构成,节点表示对象,边表示节点之间的关系。
图可以分为有向图和无向图两种类型。
在有向图中,边有方向,表示从一个节点到另一个节点的箭头;而在无向图中,边没有方向,表示节点之间的双向关系。
图中的节点可以用来表示不同的实体,如人、地点、物品等。
而边则表示节点之间的关系,可以是实体之间的联系、交互或者依赖关系等。
图的度是指与节点相连的边的数量。
在无向图中,节点的度等于与之相连的边的数量;而在有向图中,节点的度分为入度和出度,入度表示指向该节点的边的数量,出度表示从该节点出发的边的数量。
二、图的表示方法图可以使用邻接矩阵和邻接表两种方式进行表示。
邻接矩阵是一个二维数组,其中的元素表示节点之间的关系。
如果节点i和节点j之间有边相连,则邻接矩阵中的第i行第j列的元素为1;否则为0。
邻接矩阵的优点是可以快速判断两个节点之间是否有边相连,但是对于稀疏图来说,会浪费大量的空间。
邻接表是一种链表的形式,其中每个节点都有一个指针指向与之相连的节点。
邻接表的优点是可以有效地节省空间,适用于稀疏图。
但是在判断两个节点之间是否有边相连时,需要遍历链表,效率较低。
三、图的遍历算法图的遍历算法是指以某个节点为起点,按照一定的规则依次访问图中的所有节点。
深度优先搜索(DFS)是一种常用的图遍历算法。
它的思想是从起始节点开始,沿着一条路径一直访问到最后一个节点,然后回溯到上一个节点,继续访问其他路径。
DFS可以用递归或者栈来实现。
广度优先搜索(BFS)是另一种常用的图遍历算法。
它的思想是从起始节点开始,先访问所有与起始节点直接相连的节点,然后再依次访问与这些节点相连的节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二章部分习题参考答案1.证明下列结论:1)在一个无向图中,如果每个顶点的度大于等于2,则该图一定含有圈; 证明:设无向图最长的无重复顶点的迹,10k V V V P =(若含有重复顶点,则取重复顶点及其之间的点,即可构成一个圈)。
由于每个顶点度大于等于2,故存在与1V 相异的点'V 与0V 相邻,若,'P V ∉则得到比P 更长的迹,与P 的取法矛盾。
因此,P V ∈',从而0'10V V V V 是闭迹,又顶点无重复故存在圈.0'10V V V V 其他证明方式二:设在无向图G 中,有n 个顶点,m 条边。
由题意知,m>=(2n)/2=n ,而一个含有n 个顶点的树有n-1条边。
因m>=n>n-1,故该图一定含有圈。
证明方式三:(201228015029012 皇甫杨)逆否命题:在一个无向图中,若该图没有圈,则必存在顶点的度数小于2。
∵ 该图没有圈 ∴ 该图为森林∵ 森林是由树组成的,且树中必包含叶子结点 ∵ 叶子结点的度为1 ∴逆否命题得证。
(定义:迹是指边不重复的途径,而顶点不重复的途径称为路。
起点和终点重合的途径称为闭途径,起点和终点重合的迹称为闭迹,顶点不重复的闭迹称为圈。
) 2)在一个有向图D 中,如果每个顶点的出度都大于等于1,则该图一定含有一个有向圈。
证明:同上,设有向图最长的无重复顶点的有向迹,10k V V V P =每个顶点出度大于等于1,故存在'V 为k V 的出度连接点,使得'V V k 成为一条有向边,若,'P V ∉则得到比P 更长的有向迹,与P 矛盾,因此必有P V ∈',从而该图一定含有有向圈。
2.设D 是至少有三个顶点的连通有向图。
如果D 中包含有向的Euler 环游(即是通过D 中每条有向边恰好一次的闭迹),则D 中每一顶点的出度和入度相等。
反之,如果D 中每一顶点的出度与入度都相等,则D 一定包含有向的Euler 环游。
这两个结论是正确的吗?请说明理由。
如果G 是至少有三个顶点的无向图,则G 包含Euler 环游的条件是什么?证明:1)若图D 中包含有向Euler 环游,下证明每个顶点的入度和出度相等。
如果该有向图含有Euler 环游,那么该环游必经过每个顶点至少一次,每经过一次,必为“进”一次接着“出”一次,从而入度等于出度。
从而,对于任意顶点,不管该环游经过该顶点多少次,必有入度等于出度。
2)若图D 中每个顶点的入度和出度相等,则该图D 包含Euler 环游。
证明如下。
对顶点个数进行归纳。
当顶点数|v(D)|=2时,因为每个点的入度和出度相等,易得构成有向Euler 环游。
假设顶点数|v(D)|=k 时结论成立,则当顶点数|v(D)|=k + 1时,任取v ∈v(D).设S={以v 为终点的边},K={以v 为始点的边},因为v 的入度和出度相等,故S 和K 中边数相等。
记G=D-v.对G 做如下操作:任取S 和K 中各一条边21e e 、,设在D 中v v e 11=,22vv e =,则对G 和S 做如下操作 21v v G G +=, }{2e S S -=,重复此步骤直到S 为空。
这个过程最终得到的G 有k 个顶点,且每个顶点的度与在G 中完全一样。
由归纳假设,G 中存在有向Euler 环游,设为C 。
在G 中从任一点出发沿C 的对应边前行,每当遇到上述添加边v1v2时,都用对应的两条边e1,e2代替,这样可以获得有向Euler 环游。
3)G 是至少有三个顶点的无向图,则G 包含Euler 环游等价于G 中无奇度顶点。
(即任意顶点的度为偶数)。
3.设G 是具有n 个顶点和m 条边的无向图,如果G 是连通的,而且满足m = n-1,证明G 是树。
证明:思路一:只需证明G 中无圈。
若G 中有圈,则删去圈上任一条边G 仍连通。
而每个连通图边数e>=n(顶点数) – 1,但删去一条边后G 中只有n-2条边,此时不连通,从而矛盾,故G 中无圈,所以G 为树。
思路二:当2=n 时,112=-=m ,两个顶点一条边且连通无环路,显然是树。
设当)2,(1≥∈-=k N k k n 时,命题成立,则当k n =时,因为G 连通且无环路,所以至少存在一个顶点1V ,他的度数为1,设该顶点所关联的边为).,(211V V e =那么去掉顶点1V 和1e ,便得到了一个有k-1个顶点的连通无向无环路的子图'G ,且'G 的边数1'-=m m ,顶点数1'-=n n 。
由于m=n-1,所以11)1(1''-=--=-=n n m m ,由归纳假设知,'G 是树。
由于G 相当于在'G 中为2V 添加了一个子节点,所以G 也是树。
由(1),(2)原命题得证。
4. 假设用一个n n ⨯的数组来描述一个有向图的n n ⨯邻接矩阵,完成下面工作:1)编写一个函数以确定顶点的出度,函数的复杂性应为);(n Θ: 2)编写一个函数以确定图中边的数目,函数的复杂性应为);(2n Θ 3)编写一个函数删除边),(j i ,并确定代码的复杂性。
解答:(1)邻接矩阵表示为n n a ⨯,待确定的顶点为第m 个顶点m vint CountV out(int *a,int n,int m){ int out = 0; for(int i=0;i<n;i++) if(a [m-1][i]==1) out++; return out; }(2)确定图中边的数目的函数如下:int EdgeNumber(int*a,int n){ int num =0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(a[i][j]==1) num++; return num; }(3)删除边(i , j)的函数如下:void deleteEdge(int *a,int i ,int j){if(a[i-1][j-1]==0) return;a[i-1][j-1] = 0;return;}代码的时间复杂性为Θ(1)5.实现图的D-搜索算法,要求用SPARKS语言写出算法的伪代码,或者用一种计算机高级语言写出程序。
解:D搜索算法的基本思想是,用栈代替BFS中的队列,先将起始顶点存入栈中,搜索时,取出栈顶的元素,遍历搜索其相邻接点,若其邻接点还未搜索,则存入栈中并标记,遍历所有邻接点后,取出此时栈顶的元素转入下一轮遍历搜索,直至栈变为空栈。
Proc DBFS (v) //从顶点v开始,数组visited标示顶点被访问的顺序;PushS(v , S); //首先访问v,将S初始化为只含有一个元素v的栈count :=count +1; visited[v] := count;While S 非空dou :=PullHead(S); count :=count +1; visited[w] := count; //区别队列先进先出,此先进后出for 邻接于u的所有顶点w doif s[w] = 0 thenPushS(w,S); //将w存入栈Ss[w]:= 1;end{if}end{for}end{while}end{DBFS}注:PushS(w,S)将w存入栈S; PullHead(S)为取出栈最上面的元素,并从栈中删除Proc DBFT(G,m) //m为不连通分支数count:=0 ;计数器,标示已经被访问的顶点个数for i to n dos[i]:=0; //数组s 用来标示各顶点是否曾被搜索,是则标记为1,否则标记为0; end{for}for i to m do //遍历不连通分支的情况 if s[i]=0 thenDBFS (i); end{if}end{for} end{DBFT}6.下面的无向图以邻接链表存储,而且在关于每个顶点的链表中与该顶点相邻的顶点是按照字母顺序排列的。
试以此图为例描述讲义中算法DFNL 的执行过程。
邻接链表A->B->E|0 B->A->C|0 C->B->D->E|0 D->C|0E->A->C->F->G|0 F->E->G|0 G->E->F|0解:初始化 数组DFN:=0, num=1; A 为树的根节点,对A 计算DFNL(A,null),DFN(A):=num=1; L(A):=num=1; num:=1+1=2。
从邻接链表查到A 的邻接点B , 因为DFN(B)=0,对B 计算DFNL(B,A)DFN(B):= num=2; L(B):=num=2; num :=2+1=3。
查邻接链表得到B 的邻接点A ,因为DFN(A)=1 0, 但A=A,即是B 的父节点,无操作。
接着查找邻接链表得到B 的邻接点C , 因为DFN(C)=0,对C 计算DFNL(C,B)55DFN(C):= num=3; L(C):=num=3; num:=3+1=4。
查找C的邻接点B,因为DFN(B)=1 0, 但B=B,即是C的父节点,无操作。
接着查找邻接链表得到C的邻接点D,因为DFN(D)=0,对D计算DFNL(D,C),DFN(D):= num=4; L(D):=num=4; num:=4+1=5。
查找得D邻接点C,而DFN(C)=3≠0,但C=C,为D的父节点, L(D)保持不变。
D的邻接链表结束,DFNL(D,C)的计算结束。
返回到D的父节点C,查找邻接链表得到C的邻接点E,因为DFN(E)=0,对E计算DFNL(E,C),DFN(E):=num=5; L(E):=num=5; num:5+1=6;查找得E邻接点A,因DFN(A)=1≠0,又A≠C,变换L(E)=min(L(E),DFN(A))=1。
查找得E邻接点C,因DFN(C)=3≠0,但C=C,无操作。
查找得E邻接点F,因DFN(F)=0,对F计算DFNL(F,E),DFN(F):=num=6; L(F):=num=6; num:=6+1=7;查找得F邻接点E,因DFN(E)=5≠0,但E=E,无操作。
查找得F邻接点G,因DFN(G)=0,对G计算DFNL(G,F),DFN(G):=num=7; L(G):=num=7; num=7+1=8;查找G邻接点E,因DFN(E)=5≠0,又E≠F,L(G)=min(L(G),DFN(E))=5查找得G邻接点F,因DFN(F)=6≠0,但F=F,无操作。
G的邻接链表结束,DFNL(G,F)的计算结束。