1、数据结构(四),图,作业,1已知一棵以a为根结点的树边的集合为(i,m),(i,n),(e,i),(b,e),(b,d),(a,b),(g,j),(g,k),(c,g),(c,f),(h,l),(c,h),(a,c)用树型表示法画出此树,然后将此树转换成二叉树并写出此二叉树的先序、中序和后序遍历序列。 2、已知一棵二叉树的中序序列和后序序列分别为c,b,a,e,d,h,g,j,i,f 和 c,b,e,h,j,i,g,f,d,a ,画出这棵二叉树,并写出其前序遍历序列 3、 给定一组数列(5,18,12,25,6, 9,16)分别代表字符A,B,C,D,E,F,G出现的频度,试画出哈夫曼树,给出
2、各字符的编码值 4、写出按层次遍历 链式存储结构的二叉树 的算法。 建议和意见(匿名),3.3 图,一、 引言图(graph)任意两个元素之间都可能相关。应用于人工智能、工程、数学、化学、物理和计算机科学等领域。例如,在纵横交错的公路网中寻找两地间的最短路径、为复杂的大工程制定合理安排各项子工程先后次序的工程计划。,二、 图的定义及逻辑结构 1. 图的定义图G由两个集合V(G)和E(G)组成,记作G=(V,E)。,顶点的有穷非空集合,边的有穷集合,无向图:图G中的边无方向,即E(G)由顶点的无序对组成。表示为(Vi,Vj),或(Vj,Vi)。 有向图:图G中的边有方向,即E(G)由顶点的有序对
3、组成。表示为。,边的起点弧尾,V(G1)=V1,V2,V3,V4 E(G1)=(V1,V2),(V1,V3),(V1,V4),(V2,V4),(V3,V4),边的终点弧头,例:,V(G2)=V1,V2,V3 E(G2)=,注意!,两条边不同,方向相反, 网:边或弧上带有权值的图称为网。权值是与边或弧有关的数,可以表示从一顶点到另一顶点的距离或耗费等。,图的逻辑结构,分析:对于图中的任意顶点来说,都可以有多条以其为起点的边,并且可以有多条以其为终点的边。,结论:图中顶点的逻辑关系是多对多的关系,体现在顶点之间是否有边相连(邻接关系) 。,三、 图的存储结构 存储图中各顶点的数据信息和各顶点的逻辑
4、关系(邻接关系)。 1. 顺序存储结构,实现:两个数组,一维数组:存放各顶点数据信息,二维数组:存放各顶点逻辑关系,n个顶点的图,邻接矩阵为n阶方阵,方阵中只有0和1元素,,称邻接矩阵,例:写出下面无向图G5和有向图G6的邻接矩阵。,2. 链式存储结构,为每一个顶点建立 一个相应的单链表,邻接链表,存储该顶点的数据信息(头结点),及与 该顶点邻接的所有顶点的序号(表结点),结构如下 :,头结点,表结点,存放该顶点的数据信息,指针域,存放链表中第一个表结点的地址,存放该顶点的某个邻接顶点的序号,指针域,存放链表中下一个表结点的地址,例:画出下面无向图G5和有向图G6的邻接链表示意图。,构造图结构
5、,基于链接表表示的Graph结构,struct vertex VertexType data;Edge *out; typedef struct vertex Vertex;,struct edgeint jj; /*边的另一顶点的序号*/EdgeType vertexinfo; /*边表结点结构*/struct edge *next; /*指向下一条边的指针*/; typedef struct edge Edge;,构造图结构,在顶点表结构和边表结构的基础上可定义图结构如下:struct graphVertex *VertexList;int NumVertices;int MaxNumVe
6、rtices,MaxNumEdges;int NumEdges;typedef struct graph Graph;,四、 图的遍历图的遍历:是从图的某个顶点出发,沿着一定的搜索路径,对图中各个顶点进行访问,使每个顶点均被访问且仅访问一次。方法:深度优先搜索和广度优先搜索 。 1. 深度优先搜索 特点:遍历时尽可能向纵深的方向去搜索。 步骤:(从Vi出发) 访问Vi,并将其对应的访问标志位visitedi置为1;搜索出Vi的一个未访问过的邻接点Vj;用WHILE循环若存在Vj,则从Vj出发,按以上步骤继续进行深度优先搜索; 若不存在Vj,则 返回 到上一个被访问过的结点,重复、 ,直至所有顶
7、点均访问完毕。可借助栈来实现,注意! 这样一次遍历只能遍历一个连通图,对非连通图需重复多次,深度优先搜索,从A出发深度优先搜索树,例:,例:无向图G7及其邻接矩阵和邻接链表,从V1出发,对G7深度优先搜索的访问序列为: V1V2V3V4V5V6,深度优先搜索的递归算法,void dfsm(int i) /*从Vi出发,进行以邻接矩阵存储的图的深度优先搜索*/int j;printf(“%c“,veri);/*访问顶点Vi,并将对应访问标志置1,表示已访问*/visitedi=1;for(j=1;j=N;j+)/*依次搜索出Vi的一个未访问的邻接点Vj*/ if(gij=1) /*从Vj出发,继
8、续深度优先搜索*/ /*dfsm*/,2. 广度优先搜索 特点:遍历时尽可能向广的方向去横向搜索。 步骤:(从Vi出发) 访问Vi,并将对应的访问标志位visitedi置为1;搜索出Vi的各个未访问的邻接点Vj1,Vj2,Vjk并依次进行访问; 用do循环 依次分别从Vj1,Vj2,Vjk出发,按以上步骤继续进行广度优先搜索,直至所有顶点均访问完毕。 借助队列实现,同样,这样一次搜索只能遍历一个连通图,对非连通图,需多次重复。,注意!,subroutine bfsm(g,ver,i,visited)parameter(n=6) c 常数n为图中的顶点个数,假设为6integer g(n,n),
9、q(n),front,rear,visited(n)integer delqueuecharacter *1 ,ver(n) front=0rear=0print*,ver(i)visited(i)=1call enqueue(q,front,rear,i) c 将访问过的顶点入队,实现谁先被访问,其邻接顶点也先被访问。,do 10 while(front.ne.rear) j=delqueue(q,front,rear) c 谁先访问,其邻接点也先被访问 do 20 k=1,nif(g(j,k).eq.1.and.(visited(k)$ .eq.0) thenprint*,ver(k)visited(k)=1call enqueue(q,front,rear,k)endif 20 continue 10 continueend,图的应用,最短路径戴克斯特拉(E.W.Dijkstra,1959) 拓扑排序学生课程安排图,五、 小结图是所有非线性数据结构中最复杂的一种,各顶点间的逻辑关系为多对多的邻接关系。图的存储方式:邻接矩阵和邻接链表。图的遍历方法:深度优先搜索(递归方法)和广度优先搜索(借助队列)。重点掌握图的有关概念、术语和存储方法,理解各种算法的实质并联系实际问题。上机题三:给定一个非连通,用邻接矩阵进行存储,写出其广度优先搜索进行遍历的结果。(时间:4小时),