数据结构与算法之图的深度优先遍历(DFS)
数据结构与算法之图的深度优先遍历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);}}
}
算法复杂度分析
时间复杂度=访问各节点所需时间 + 探索各条边所需时间
邻接矩阵
- 访问 ∣V∣|V|∣V∣个顶点需要 O∣V∣O|V|O∣V∣的时间
- 查找每个顶点的邻接点都需要 O(∣V∣)O(|V|)O(∣V∣)的时间,而总共有|V|个结点,时间复杂度=O(∣V∣2)O(|V|^2)O(∣V∣2)
邻接表
- 访问|V|个顶点需要 O(|V|) 的时间
- 查找各个顶点的邻接点共需要 O(∣E∣)O(|E|)O(∣E∣)的时间,时间复杂度为:O(∣V∣+∣E∣)O(|V|+|E|)O(∣V∣+∣E∣)。
注意:
- 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一
- 同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一
深度优先生成树
- 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一,深度优先生成树也唯一
- 同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一,深度优先生成也不唯一
树节点示意图
生成树示意图
深度优先生成森林
同 广度优先生成森林 一样
图的遍历与图的连通性
- 对无向图进行 BFS/DFS 遍历,调用 BFS/DFS 次数=连通分量数
- 对于连通图,只需调用 1 次 BFS/DFS
- 对有向图进行 BFS/DFS 遍历,调用 BFS/DFS 次数要具体分析
- 若起始顶点到其他各顶点都有路径,则只需要调用 1 次 BFS/DFS 函数
- 对于强连通图,从任一结点出发都只需要调用 1 次 BFS/DFS。
无向图&连通图
有向图&强连通图
知识回顾与重要考点
数据结构与算法之图的深度优先遍历(DFS)相关推荐
- 图的深度优先遍历DFS(JAVA)
图的深度优先遍历算法 在此介绍图的基本算法之一的深度优先遍历(DFS)算法 广度优先搜索(BFS). 什么是DFS 图是由节点(Node)和路径(Route)组成的一种数据结构,用于反应各节点间的关系 ...
- 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
https://www.cnblogs.com/qzhc/p/10291430.html 最后一个广度优先有错误,H不指向E,只有G指向E,所以顺序应该是ABCFDHGE
- 图的深度优先遍历和广度优先遍历_图的深度优先遍历(DFS)与广度优先遍历(BFS)的c语言实现...
头文件 #pragma warning( disable : 4996)#pragma once#ifndef _GRAPH_H_#define _GRAPH_H_ #define MAX_VERTE ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构与算法学习笔记:图...
图: 图结构区别于线性结构和树型结构,区别可见下图 逻辑上的图(graph)结构由顶点(vertex)和边(edge)组成. 一个图结构G包含顶点集合V和边集合E,任何两个顶点之间可以有一个边表示两者 ...
- java数据结构和算法——图的深度优先(DFS)遍历
目录 一.图的遍历介绍 二.图的深度优先搜索(Depth First Search) 三.图的深度优先遍历算法步骤 四.图的深度优先遍历示例需求 五.图的深度优先遍历代码示例 一.图的遍历介绍 所谓图 ...
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- 分别用邻接矩阵和邻接表实现图的深度优先遍历和广度优先遍历_数据结构|图的邻接表与深度、广度优先搜索
线性存储元素时,元素的关系也同时确定了.而非线性数据结构就不同了,需要同时考虑存储数据元素和数据元素的关系. 由于图的结构比较复杂,任意两个顶点之间都可能存在联系,因此无法以数据元素在存储区中的物理位 ...
- 超详细C语言版数据结构:图的深度优先遍历(推荐收藏)
文章目录 一.邻接矩阵存储图的深度优先遍历过程分析 二.结果分析 三.C语言编程实现图的深度优先遍历 四.图的遍历及其应用 一.邻接矩阵存储图的深度优先遍历过程分析 对图1这样的无向图,要写成邻接矩阵 ...
- 获取图顶点的入度、出度;获取图的两个顶点之间的权值; 图的深度优先算法、图的广度优先遍历
广度优先结果: 深度优先结果: 代码整理: public class Graph {private int vertexSize;//顶点数量private int[] vertexs;//顶点数组p ...
- 数据结构 图的深度优先遍历 C
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Bool ...
最新文章
- 我写代码的十八般兵器!
- 20165330 结对编程项目-四则运算 第一周
- WinForm控件之【NumericUpDown】
- 关于网页乱码和字符编码方式
- 头文件(C++11)、从文件输入输出
- 移动开发的分辨率问题
- linux实例大全学习笔记1
- 什么时候使用Shell
- 【OpenCV 例程200篇】10. 图像的拼接(np.hstack)
- linux编译minix,MINIX对Linux
- paip.执行shell cmd 命令uapi java php python总结
- paip.图片文件上传功能总结
- 一个苹果证书怎么多次使用——导出p12文件
- 手机连无线显示服务器超时,手机登录melogin.cn连接超时解决步骤
- 车主必看,2021年车险改革内容,2022年车险改革
- 1155低功耗cpu排行_1155针可以配那些cpu都列举出来
- 原子操作(Atomic)
- c语言实现各种排序算法(作业:点名册排序)
- 2021年企业服务行业BP和融资计划书PPT模板
- git status怎么操作_git操作-方向对了,就不怕路远了!-51CTO博客