1 / 164

复习:树

复习:树. 树的基本概念和术语 二叉树的概念及性质 二叉树的存储结构 顺序存储 链式存储 遍历二叉树 递归算法 非递归算法 线索二叉树 树的应用:哈夫曼树. 第 8 章 图. 重点内容. 图的定义和术语 图与线性表、树形结构的关系 图的表示 术语:基本术语, [ 特别注意:弧尾,弧头,有序,无序 ] 三种关系:图与网,顶点与边的数目,图与树、森林 图的存储结构 顺序存储:数组表示法 链表存储:邻接表,多重链表表示法,十字链表,邻接多重表 掌握: 存储结构的存储方式,各种操作的实现思想 各种存储结构的特点和优势 图的遍历:深度优先,广度优先.

cyrus-ray
Download Presentation

复习:树

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 复习:树 • 树的基本概念和术语 • 二叉树的概念及性质 • 二叉树的存储结构 • 顺序存储 • 链式存储 • 遍历二叉树 • 递归算法 • 非递归算法 • 线索二叉树 • 树的应用:哈夫曼树

  2. 第8章 图

  3. 重点内容 图的定义和术语 • 图与线性表、树形结构的关系 • 图的表示 • 术语:基本术语,[特别注意:弧尾,弧头,有序,无序] • 三种关系:图与网,顶点与边的数目,图与树、森林 图的存储结构 • 顺序存储:数组表示法 • 链表存储:邻接表,多重链表表示法,十字链表,邻接多重表 • 掌握: • 存储结构的存储方式,各种操作的实现思想 • 各种存储结构的特点和优势 • 图的遍历:深度优先,广度优先

  4. 8.1 图的基本概念 • 图的定义(P135) • 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E)其中:G表示一个图,V(vertex)是图G中顶点的集合,E(edge)是图G中顶点之间边的集合。 即:V = { x | x 某个数据对象}是顶点的有穷非空集合; E = {(x, y) | x, y V } 是顶点之间关系的有穷集合,也叫做边(edge)集 合。例如:E={ <A,B>,<C,D>,<A.D>,<B,C>}

  5. V2 V1 V3 V5 V4 V1 V2 V4 V3 8.1 图的逻辑结构 若顶点vi和vj之间的边没有方向,则称这条边为无向边,表示为(vi,vj)。 如果图的任意两个顶点之间的边都是无向边,则称该图为无向图undigraph。 若从顶点vi到vj的边有方向,则称这条边为有向边,表示为<vi,vj>。 如果图的任意两个顶点之间的边都是有向边,则称该图为有向图digraph。

  6. V2 V1 V2 V1 V4 V3 V3 8.1 图的逻辑结构 • 图的基本术语(P136-137) • 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。 • 有向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。

  7. 图的分类 • 着眼点:存储结构的选择。

  8. 8.1 图的逻辑结构 • 图的基本术语(续) • 顶点的度:在无向图中,顶点v的度是指依附于该顶点的边数,通常记为TD (v)。 • 顶点的入度:在有向图中,顶点v的入度是指以该顶点为弧头的弧的数目,记为ID (v); • 顶点的出度:在有向图中,顶点v的出度是指以该顶点为弧尾的弧的数目,记为OD (v)。

  9. 2 V1 V2 7 5 8 V4 V3 8.1 图的逻辑结构 • 图的基本术语(续) • 权:是指对边赋予的有意义的数值量。 • 网:边上带权的图,也称网图。

  10. V2 V1 V3 V5 V4 8.1 图的逻辑结构 • 图的基本术语(续) • 路径:着眼点:顶点间的联系。 V1 到V4的路径: V1 V4 V1 V2 V3 V4 V1 V2 V5V3 V4 • 一般情况下,图中的路径不惟一。

  11. V2 V1 V3 V5 V4 8.1 图的逻辑结构 • 图的基本术语(续) • 路径长度: • 非带权图——路径上边的个数 • 带权图——路径上各边的权之和 V1 V4:长度为1 V1 V2 V3 V4 :长度为3 V1 V2 V5V3 V4 :长度为4

  12. V2 V1 V3 2 V5 V4 3 5 8 2 6 8.1 图的逻辑结构 • 图的基本术语(续) • 路径长度: • 非带权图——路径上边的个数 • 带权图——路径上各边的权之和 V1 V4:长度为8 V1 V2 V3 V4 :长度为7 V1 V2 V5V3 V4 :长度为15

  13. V2 V1 V3 V5 V4 V1 V2 V4 V3 8.1 图的逻辑结构 • 图的基本术语(续) • 回路(环):第一个顶点和最后一个顶点相同的路径。 • 简单路径:序列中顶点不重复出现的路径。 • 简单回路(简单环):除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。

  14. V2 V2 V1 V1 V3 V5 V4 V3 V1 V4 V5 V3 V4 8.1 图的逻辑结构 • 图的基本术语(续) • 子图:若图G=(V,E),G'=(V',E'),如果V'V且E'E ,则称图G'是G的子图。

  15. 8.1 图的逻辑结构 • 图的基本术语(续) • 连通图:在无向图中,如果从一个顶点vi到另一个顶点vj(i≠j)有路径,则称顶点vi和vj是连通的。如果图中任意两个顶点都是连通的,则称该图是连通图。 • 连通分量:非连通图的极大连通子图称为连通分量。 1.含有极大顶点数; 2. 依附于这些顶点的所有边。

  16. 8.1 图的逻辑结构 • 图的基本术语(续) • 强连通图:在有向图中,对图中任意一对顶点vi和vj(i≠j),若从顶点vi到顶点vj和从顶点vj到顶点vi均有路径,则称该有向图是强连通图。 • 强连通分量:非强连通图的极大强连通子图。

  17. 8.1 图的逻辑结构 • 图的基本术语(续) • 生成树:n个顶点的连通图G的生成树是包含G中全部顶点的一个极小连通子图。 • 生成森林:在非连通图中,由每个连通分量都可以得到一棵生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。 多——构成回路 少——不连通 含有n-1条边

  18. 8.1 图的逻辑结构

  19. 考研真题一 1.图中有关路径的定义是( )。【北方交通大学 2001 一、24 (2分)】 A.由顶点和相邻顶点序偶构成的边所形成的序列 B.由不同顶点所形成的序列 C.由不同边所形成的序列 D.上述定义都不是 2.设无向图的顶点个数为n,则该图最多有( )条边。 A.n-1 B.n(n-1)/2 C. n(n+1)/2 D.0 E.n2 【清华大学 1998 一、5 (2分)】【西安电子科技大 1998 一、6 (2分)】【北京航空航天大学 1999 一、7 (2分)】 3.一个n个顶点的连通无向图,其边的个数至少为( )【浙江大学 99 四、4 (4分)】 A.n-1 B.n C.n+1 D.nlogn;

  20. 考研真题一 4.要连通具有n个顶点的有向图,至少需要( )条边。【北航 2000 一、6(2分)】 A.n-l B.n C.n+l D.2n 5.n个结点的完全有向图含有边的数目(   )。【中山大学 1998 二、9 (2分)】 A.n*n B.n(n+1) C.n/2 D.n*(n-l) 6.一个有n个结点的图,最少有( )个连通分量,最多有( )个连通分量。【北邮 2000 二、5 (20/8分)】 A.0 B.1 C.n-1 D.N 7.在一个无向图中,所有顶点的度数之和等于所有边数( )倍,在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的( )倍。【哈工大01 (2分)】 A.1/2 B.2 C.1 D.4

  21. 考研真题一 • 1.判断一个无向图是一棵树的条件是______。 • 2.有向图G的强连通分量是指______。【北京科技大学 1997 一、7】 • 3.一个连通图的______是一个极小连通子图。【重庆大学 2000 一、1】 • 4.具有10个顶点的无向图,边的总数最多为______。【华中理工大学 2000 一、7 (1分)】 • 5.若用n表示图中顶点数目,则有_______条边的无向图成为完全图。【燕山大学1998 一、6(1分)】

  22. 考研真题一 证明:具有n个顶点n-1条边的无向连通图是自由树,即没有确定根结点的树,每个结点均可当根。若边数多于n-1条,因一条边要连接两个结点,则必因加上这一条边而使两个结点多了一条通路,即形成回路。形成回路的连通图不再是树(在图论中树定义为无回路的连通图)。 1.(1).如果G1是一个具有n个顶点的连通无向图,那么G1最多有多少条边?G1最少有多少条边? (2).如果G2是一个具有n个顶点的强连通有向图,那么G2最多有多少条边?G2最少有多少条边? (3).如果G3是一个具有n个顶点的弱连通有向图,那么G3最多有多少条边?G3最少有多少条边? 【复旦大学 1997 一(9分)】 4.证明:具有n个顶点和多于n-1条边的无向连通图G一定不是树。【东南大学 1993 四(10分)】

  23. 8.2 图的存储结构及实现 • 是否可以采用顺序存储结构存储图? • 图的特点:顶点之间的关系是m:n,即任何两个顶点之间都可能存在关系(边),无法通过存储位置表示这种任意的逻辑关系,所以,图没有顺序映象的存储结构。但可以借助数组的数据类型表示元素之间的关系。 • 如何存储图? • 考虑图的定义,图是由顶点和边组成的,分别考虑如何存储顶点、如何存储边。

  24. 1 若(vi, vj)∈E(或<vi, vj>∈E) 0 其它 edges[i][j]= 8.2 图的存储结构及实现——邻接矩阵 • 1. 邻接矩阵(数组表示法) • 基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系(图的顺序存储) • 假设图G=(V,E)有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:

  25. 邻接矩阵的结构型定义 引用: Mgraph g; a=g.n Typedef struct { Int no; //顶点编号 Char info; //顶点其他信息 }vertextype; //一维数组存储图中顶点的信息 Typedef struct { Int edge[maxsize][maxsize]; //二维数组存储各顶点之间的邻接关系,边的关系用顶点的有序对表示 Int n,e; // n顶点数和 e边数 Vertextype vex[maxsize]; //存放结点信息 }MGraph;//边、结点共同表示出图的结构

  26. V1 V2 V3 V4 vexs= V4 V1 V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= V3 V2 无向图的邻接矩阵的特点? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 主对角线为 0 且一定是对称矩阵。

  27. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= 如何求顶点i的度? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 V4 V1 V3 V2 邻接矩阵的第i行(或第i列)非零元素的个数。

  28. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= 如何判断顶点 i 和 j 之间是否存在边? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 V4 V1 V3 V2 测试邻接矩阵中相应位置的元素edges[i][j]是否为1。

  29. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= 如何求顶点 i 的所有邻接点? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 V4 V1 V3 V2 将数组中第 i行元素扫描一遍,若edges[i][j]为1,则顶点 j为顶点 i 的邻接点。

  30. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 有向图的邻接矩阵一定不对称吗? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 不一定,例如有向完全图。

  31. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 如何求顶点 i 的出度? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 邻接矩阵的第 i 行元素之和。

  32. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 如何求顶点 i 的入度? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 邻接矩阵的第 i 列元素之和。

  33. V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 如何判断从顶点 i 到顶点 j 是否存在边? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 测试邻接矩阵中相应位置的元素edges[i][j]是否为1。

  34. wij若(vi, vj)∈E(或<vi, vj>∈E) 0 若i=j ∞ 其他 edges[i][j]= 2 0 2 5 ∞ ∞ 0 ∞∞ ∞ ∞ 0 8 7 ∞ ∞ 0 V1 V2 7 5 edges= 8 V4 V3 8.2 图的存储结构及实现——邻接矩阵 网图的邻接矩阵可定义为:

  35. 邻接矩阵的结构型定义 引用: Mgraph g; a=g.n Typedef struct { Int no; //顶点编号 Char info; //顶点其他信息 }vertextype; //一维数组存储图中顶点的信息 Typedef struct { Int edge[maxsize][maxsize]; //二维数组存储各顶点之间的邻接关系,边的关系用顶点的有序对表示 Int n,e; // n顶点数和 e边数 Vertextype vex[maxsize]; //存放结点信息 }MGraph;//边、结点共同表示出图的结构

  36. 8.2 图的存储结构及实现——邻接表 • 2. 邻接表 • 邻接表存储的基本思想:对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表(对于有向图则称为出边表),所有边表的头指针和存储顶点信息的一维数组构成了顶点表。

  37. data firstedge adjvex nextedge 8.2 图的存储结构及实现——邻接表 邻接表有两种结点结构:顶点表结点和边表结点。 顶点表 边 表 data:数据域,存放顶点信息。 firstedge:指针域,指向边表中第一个结点。 adjvex:邻接点域,边的终点在顶点表中的下标。 nextedge:指针域,指向边表中的下一个结点。

  38. 8.2 图的存储结构及实现——邻接表 Typedef struct arcNode { Int adjvex; // 边指向的结点的位置 Struct ArcNode *nextarc; // 指向下一条边的指针 Int info; //边的相关信息,如权重 }ArcNode; // 边表,以链表的形式存储 Typedef struct VNode{ Char data; // 顶点的信息 arcNode *firstarc; //指向第一条边的指针 }VNode; // 顶点表,通常以顺序结构的形式存储 Typedef struct { VNode adjlist[maxsize]; // 邻接表 Int n,e; // 图中顶点数n 和边数 e }AGraph; // 图的邻接表类型

  39. V4 V1 V3 V2 data firstedge 0 1 2 3 V1 1 3 ∧ V2 0 2 3 ∧ 边表中的结点表示什么? V3 1 ∧ V4 0 1 ∧ 无向图的邻接表 每个结点对应图中的一条边, 邻接表的空间复杂度为O(n+e)。

  40. V4 V1 V3 V2 data firstedge 0 1 2 3 V1 1 3 ∧ V2 0 2 3 ∧ 如何求顶点 i 的度? V3 1 ∧ V4 0 1 ∧ 无向图的邻接表 顶点i的边表中结点的个数。

  41. 如何判断顶点 i 和顶点 j 之间是否存在边? V4 V1 V3 V2 data firstedge 0 1 2 3 V1 1 3 ∧ V2 0 2 3 ∧ V3 1 ∧ V4 0 1 ∧ 无向图的邻接表 测试顶点 i 的边表中是否存在终点为 j 的结点。

  42. V1 V2 data firstedge 0 1 2 3 V1 1 2 ∧ V2 ∧ 如何求顶点 i 的出度? V3 3 ∧ V4 V3 V4 0 ∧ 有向图的邻接表 顶点 i 的出边表中结点的个数。

  43. V1 V2 data firstedge 0 1 2 3 V1 1 2 ∧ V2 ∧ 如何求顶点 i 的入度? V3 3 ∧ V4 V3 V4 0 ∧ 有向图的邻接表 各顶点的出边表中以顶点 i 为 终点的结点个数。

  44. V1 V2 data firstedge 0 1 2 3 V1 1 2 ∧ V2 ∧ 如何求顶点 i 的所有邻接点? V3 3 ∧ V4 V3 V4 0 ∧ 有向图的邻接表 遍历顶点 i 的边表,该边表中的所有终点都是顶点 i 的邻接点。

  45. data firstedge 0 1 2 3 2 1 V1 5 2 ∧ V2 ∧ 2 V3 8 3 ∧ V4 V1 V2 7 0 ∧ 7 5 8 V4 V3 网图的邻接表

  46. V1 V2 v1 0 1 2 3 1 2 ∧ v2 邻接表 ∧ v3 3 ∧ v4 0 1 ∧ V4 V3 v1 0 1 2 3 3 ∧ v2 0 3 ∧ v3 逆邻接表 0 ∧ v4 2 ∧ 8.2 图的存储结构及实现——邻接表 为了便于确定顶点的入度或以顶点vi为头的弧,可以建立一个有向图的逆邻接表。对每个顶点建立一个链接以vi为头的弧的表。

  47. 考研真题二: 12. 从邻接阵矩可以看出,该图共有(①)个顶点;如果是有向图该图共有(②) 条弧;如果是无向图,则共有(③)条边。【中科院软件所 1999 六、2(3分)】 • ①.A.9 B.3 C.6 D.1 E.以上答案均不正确 • ②.A.5 B.4 C.3 D.2 E.以上答案均不正确 • ③.A.5 B.4 C.3 D.2 E.以上答案均不正确 13.当一个有N个顶点的图用邻接矩阵A表示时,顶点Vi的度是( )。【南京理工大学1998一、4(2分)】

  48. 作业四、考研真题二 • 9.有向图的邻接表存储如下:(1).画出其邻接矩阵存储;(2).写出图的所有强连通分量;(3).写出顶点a到顶点i的全部简单路径。【东北大学 1997 一、5 (5分)】

  49. 十字链表 • 2.4.1 结构图:将邻接表、逆邻接表合二为一。主要用于表示有向图。 • 和稀疏矩阵的十字链表结构相比:本质一样。 • 细节差别在于:行头表和列头表合并为了顶点表。

  50. A E D C B 十字链表 • 等价结构:

More Related