数据结构与算法之图的深度优先遍历DFS

  • 前要
    • 树的先根遍历
  • 图的深度优先遍历
    • 算法存在的问题
    • 算法复杂度分析
      • 邻接矩阵
    • 邻接表
  • 深度优先生成树
    • 深度优先生成森林
  • 图的遍历与图的连通性
  • 知识回顾与重要考点

前要

树的先根遍历

学习图的深度优先遍历 (DFS),先复习下 树的深度优先遍历(这里以先根遍历为例)。

//树的先根遍历
void PreOrder(TreeNode *R*){if(R!=NULL){visit(R); //访问根节点while(R还有下一个子树T){PreOrder(T);  //先根遍历下一颗子树}}
}

新找到的相邻接点一定是没有访问的。

图的深度优先遍历

这里的 FirstNeighbor(G,v)NextNeighbor(G,v,w) 同上文 方法说明

bool visited[MAX_VERTEX_NUM]; //访问标记数组
void DFS(Graph G,int v){  //访问标记数组visit(v); //从顶点v出发,深度优先遍历图Gvisited[]=TRUE;  //设已访问标记for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){ if(!visited[w]){  //w为u的尚未访问的邻接顶点DFS(G,w);}}
}

算法存在的问题

如果是非连通图,则无法遍历完所有结点

bool visited[MAX_VERTEX_NUM]; //访问标记数组void DFSTrave(Graph G){for(v=0;v<G.vexnum;v++){visited[v]=FALSE;}for(v=0;v<G.vexnum;v++){if(!visited[i]){DFS(G,v);}}
}void DFS(Graph G,int v){  //访问标记数组visit(v); //从顶点v出发,深度优先遍历图Gvisited[]=TRUE;  //设已访问标记for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){ if(!visited[w]){  //w为u的尚未访问的邻接顶点DFS(G,w);}}
}

算法复杂度分析

时间复杂度=访问各节点所需时间 + 探索各条边所需时间

邻接矩阵

  1. 访问 ∣V∣|V|∣V∣个顶点需要 O∣V∣O|V|O∣V∣的时间
  2. 查找每个顶点的邻接点都需要 O(∣V∣)O(|V|)O(∣V∣)的时间,而总共有|V|个结点,时间复杂度=O(∣V∣2)O(|V|^2)O(∣V∣2)

邻接表

  1. 访问|V|个顶点需要 O(|V|) 的时间
  2. 查找各个顶点的邻接点共需要 O(∣E∣)O(|E|)O(∣E∣)的时间,时间复杂度为:O(∣V∣+∣E∣)O(|V|+|E|)O(∣V∣+∣E∣)。

注意:

  1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一
  2. 同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一

深度优先生成树

  1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一深度优先生成树也唯一
  2. 同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一深度优先生成也不唯一

树节点示意图

生成树示意图

深度优先生成森林

同 广度优先生成森林 一样

图的遍历与图的连通性

  1. 对无向图进行 BFS/DFS 遍历,调用 BFS/DFS 次数=连通分量数

    1. 对于连通图,只需调用 1 次 BFS/DFS
  2. 对有向图进行 BFS/DFS 遍历,调用 BFS/DFS 次数要具体分析
    1. 若起始顶点到其他各顶点都有路径,则只需要调用 1 次 BFS/DFS 函数
  3. 对于强连通图,从任一结点出发都只需要调用 1 次 BFS/DFS。
    无向图&连通图

有向图&强连通图

知识回顾与重要考点

数据结构与算法之图的深度优先遍历(DFS)相关推荐

  1. 图的深度优先遍历DFS(JAVA)

    图的深度优先遍历算法 在此介绍图的基本算法之一的深度优先遍历(DFS)算法 广度优先搜索(BFS). 什么是DFS 图是由节点(Node)和路径(Route)组成的一种数据结构,用于反应各节点间的关系 ...

  2. 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    https://www.cnblogs.com/qzhc/p/10291430.html 最后一个广度优先有错误,H不指向E,只有G指向E,所以顺序应该是ABCFDHGE

  3. 图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...

    头文件 #pragma warning( disable : 4996)#pragma once#ifndef _GRAPH_H_#define _GRAPH_H_ #define MAX_VERTE ...

  4. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...

    图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...

  5. java数据结构和算法——图的深度优先(DFS)遍历

    目录 一.图的遍历介绍 二.图的深度优先搜索(Depth First Search) 三.图的深度优先遍历算法步骤 四.图的深度优先遍历示例需求 五.图的深度优先遍历代码示例 一.图的遍历介绍 所谓图 ...

  6. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  7. 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索

    线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...

  8. 超详细C语言版数据结构:图的深度优先遍历(推荐收藏)

    文章目录 一.邻接矩阵存储图的深度优先遍历过程分析 二.结果分析 三.C语言编程实现图的深度优先遍历 四.图的遍历及其应用 一.邻接矩阵存储图的深度优先遍历过程分析 对图1这样的无向图,要写成邻接矩阵 ...

  9. 获取图顶点的入度、出度;获取图的两个顶点之间的权值; 图的深度优先算法、图的广度优先遍历

    广度优先结果: 深度优先结果: 代码整理: public class Graph {private int vertexSize;//顶点数量private int[] vertexs;//顶点数组p ...

  10. 数据结构 图的深度优先遍历 C

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Bool ...

最新文章

  1. 我写代码的十八般兵器!
  2. 20165330 结对编程项目-四则运算 第一周
  3. WinForm控件之【NumericUpDown】
  4. 关于网页乱码和字符编码方式
  5. 头文件(C++11)、从文件输入输出
  6. 移动开发的分辨率问题
  7. linux实例大全学习笔记1
  8. 什么时候使用Shell
  9. 【OpenCV 例程200篇】10. 图像的拼接(np.hstack)
  10. linux编译minix,MINIX对Linux
  11. paip.执行shell cmd 命令uapi java php python总结
  12. paip.图片文件上传功能总结
  13. 一个苹果证书怎么多次使用——导出p12文件
  14. 手机连无线显示服务器超时,手机登录melogin.cn连接超时解决步骤
  15. 车主必看,2021年车险改革内容,2022年车险改革
  16. 1155低功耗cpu排行_1155针可以配那些cpu都列举出来
  17. 原子操作(Atomic)
  18. c语言实现各种排序算法(作业:点名册排序)
  19. 2021年企业服务行业BP和融资计划书PPT模板
  20. git status怎么操作_git操作-方向对了,就不怕路远了!-51CTO博客

热门文章

  1. CMOS的宽/长比、传输门与三态门、锁存器与触发器、简单版图、竞争与冒险
  2. 数据库连接池实现原理
  3. RK3399 USB RNIDS/gagnet实战
  4. 服务器维修责合同,2021年服务器维护委托合同样本.doc
  5. POJ 3744 Scout YYF I:概率dp
  6. Hashcat密码破解
  7. 堆排序(Heapsort)-全网最详细
  8. 三维扫描仪[8]——如何设计一台云台式扫描仪(机械结构)
  9. zxing绘制条形码总结
  10. 光纤线上线缆标识信息解读