数据结构——图的遍历

文章目录


前言

  1. 图的遍历
  2. 深度优先搜索
  3. 广度优先搜索
  4. 邻接矩阵存储结构
  5. 图的遍历与图的连通性

一、图的遍历

  1. 定义:图的遍历就是按照某种次序访问图中每个顶点一次且一次

基本方法:

深度优先搜索遍历(dfs)

广度优先搜索遍历(bfs)

  1. 基本算法:连通图的深度优先搜索遍历类似于树的先根遍历,其思想如下:
    假定图中某个定点v1出发,首先访问出发点然后选择一个v1的未访问的邻接点V2,以V2为新的出发点继续进行深度优先搜索,直至图中的所有节点都访问完成。

广度优先搜索(BFS)&&深度优先搜索(DFS)

广度优先搜索(BFS)

  1. 定义:首先由顶点v出发,访问v中各个未被访问的邻接结点,然后再依次访问邻接结点的未被访问过的邻接结点;是一种分层查找方式,每向前走一步,访问一批结点,不是递归;为了实现逐层访问,必须借助一个辅助队列(例题见下图);图的广度优先搜索与二叉树的层序遍历完全一致

  2. 【图的广度优先搜索(BFS) ------由近及远逐层访问顶点,类似于树的按层次遍历。】

  3. 算法性能分析:需要一个辅助队列,最坏情况下,空间复杂度为O(|V|);邻接表时间复杂度为O(|V|+|E|),邻接矩阵时间复杂度为O(|V|²)

  4. 广度优先生成树:广度遍历中,得到一颗遍历树,称为广度优先生成树;一给定图的邻接矩阵存储是唯一的,故其广度优先生成树也是唯一,但邻接表存储不唯一,故广度优先生成树不唯一

广度优先遍历图算法

c 复制代码
void  travel_bfs(graph G)
 { for(i=1;i<=n;i++)               visited[i]=FALSE;
      for(i=1;i<=n;i++)
         if(!visited[i]) 
           bfs(i);
         }
void bfs(graph G, int v0)
{ int w; queue Q;
 init_queue(Q);
visite(v0); visited[v0]=TRUE;
En_queue(Q,v0);
 while(!Q.Empty())
    { v=del_queue(Q);
       w=firstadj(G,v);
       while(w!=0) 
       {  if(!visite[w])
          { visite(w);
             visited[w]=TRUE;
             En_queue(Q.w) ;}
        w=nextadj(G,v,w);
 		}
}
}

深度优先搜索(DFS)

  1. 定义:类似于树的先序遍历,尽量进行深层遍历;从一个顶点出发,挨个访问其邻边未被访问过的顶点,一直访问到不能继续进行的时候退回到原来的顶点,退回路中挨个查找其邻边未被访问过的顶点,并访问之,一直退回到原点
  2. 算法性能分析:需要一个递归工作栈,空间复杂度为O(|V|),邻接矩阵存储,时间复杂度为O(|V|²),邻接表存储,时间复杂度为O(|V|+|E|)
  3. 深度优先生成树和森林:对连通图调用DFS生成树,否则生成森林

如果将访问过程中搜索顶点的实箭头所对应的边(或弧)连起来,则可构成一棵树。



邻接矩阵存储结构

  1. 一个有n个顶点的图,在深度优先搜索图的过程中,找邻接点所需时间为O(n2)。
  2. 对辅助数组初始化时间为O(n)。
  3. 因此,当用邻接矩阵作为图的存储结构时,深度优先搜索图的时间复杂性为O(n2)。
  4. 根据图中所示,写出深度优先和广度优先的遍历次序

深度优先遍历:1 4 5 3 2

广度优先遍历:1 4 3 2 5

图的遍历与图的连通性

  1. 图的遍历算法可以判断图的连通性;对于无向图,若是连通,则从一点出发,仅需一次遍历就能访问图中所有结点,若是非连通,则一次只能访问连通分量;对于有向图,若从一个结点到每个结点都有路径,则能够访问到图中所有结点,否则不能
  2. 最小生成树需要满足的条件
    a. 必须包含图中所有的顶点
    b. 极小连通子图 (n-1)条边
    c. 不能有环路

总结

  1. 图的遍历
  2. 深度优先搜索
  3. 广度优先搜索
  4. 邻接矩阵存储结构
  5. 图的遍历与图的连通性
相关推荐
~yY…s<#>1 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
XuanRanDev2 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
代码猪猪傻瓜coding2 小时前
力扣1 两数之和
数据结构·算法·leetcode
南宫生3 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
weixin_432702264 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
passer__jw7675 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
爱吃生蚝的于勒6 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~6 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
脉牛杂德6 小时前
多项式加法——C语言
数据结构·c++·算法
一直学习永不止步7 小时前
LeetCode题练习与总结:赎金信--383
java·数据结构·算法·leetcode·字符串·哈希表·计数