一. 什么是深度优先遍历

深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点为新的源点重复上述过程,直至图中所有的顶点均已被访问为止。

深度优先遍历结果是: A B E F C D G H

深度优先遍历尽可能优先往深层次进行搜索

二.广度优先遍历

广度优先遍历可定义如下:首先访问出发点v,接着依次访问v的所有邻接点w1、w2......wt,然后依次访问w1、w2......wt邻接的所有未曾访问过的顶点。以此类推,直至图中所有和源点v有路径相通的顶点都已访问到为止。此时从v开始的搜索过程结束。

广度优先遍历结果是: A B C D E F G H I

广度优先遍历按层次优先搜索最近的结点,一层一层往外搜索。

三. 创建的步骤

    深度优先遍历创建步骤(Depth First Search)

 1.访问初始节点 v,并标记为已访问

 2.查找结点v的第一个邻接点 w

 3.若w存在   则执行4   若不存在回到第一步 再找 v结点的下一个结点

 4.判断w是否被访问   未访问对w深度优先遍历(即把w当作另一个v ,再进行1 2 3);

 5.查找v 在w 后面是否还有下一个邻接点   再执行步骤3 

广度优先遍历步骤

(需要用到队列来实现对 顺序的访问他的所有邻接点)

 1.访问初始节点 v,并标记为已访问

 2.结点v 入队列

 3.当队列非空时 继续执行,否则结束

 4. 出队列 ,取得头结点u

 5. 查找结点u 的第一个邻接点w

6. 若结点u 邻接点不存在 则执行 步骤3 否则循环执行以下三个步骤

      6.1. 若结点w 未被访问 则访问节点w 并标记为已访问

      6.2 结点w 入队

      6.3 查找结点u的 除了w 之后的下一个其他邻接点

四. 代码实现

//深度优先遍历public void dfs(boolean [] isVisied,int i) {//传入是否被访问的数组  ,和第几个邻接点 System.out.printf(getVertexInf(i)+"-->");isVisied[i]=true;//查找i节点的第一个邻接点int f = getFirstNeighbor(i);while(f!=-1) {//表示第一个邻接点存在//判断是否被访问if(!isVisied[f]) {dfs(isVisied, f);} //这个i 的下一个邻接点已经被访问了,再找这个节点的下一个结点f= getNextNeighbor(i,f);}}//对每个节点遍历//当一个节点访问完后 还有其他未访问的,利用循环 遍历所有的结点public void DFS() {isVisited= new boolean[getNumOfV()];for(int i=0;i<vertexList.size();i++){if(!isVisited[i]) {dfs(isVisited,i);}}}
//广度优先遍历   对第i个结点遍历  利用队列来实现public void bfs(boolean [] isVisied,int i) {int u;  //表示队列的第一个元素int w ;  //表示这个节点的邻接点LinkedList queue = new LinkedList(); //创建出队列//调用这个方法就意味着 满足条件可以输出System.out.printf(getVertexInf(i)+"==>");//把这个结点置为i访问isVisied[i]=true;//将节点加入 到队列中queue.addLast(i);  //在队尾添加元素//循环判断队列是否还有元素while(!queue.isEmpty()) {//给第一个元素出队列u = (int) queue.removeFirst();//找这个元素的邻接点w = getFirstNeighbor(u);while(w!=-1) {//找到邻接点if(!isVisied[w]) {//判断是否已访问System.out.printf(getVertexInf(w)+"==>");//把这个结点置为i访问isVisied[w]=true;//将节点加入 到队列中queue.addLast(w);  //在队尾添加元素}//继续寻找下一个  广度的w = getNextNeighbor(u, w);}}}//对每个节点遍历public void BFS() {isVisited= new boolean[getNumOfV()];for(int i=0;i<vertexList.size();i++){if(!isVisited[i]) {bfs(isVisited,i);}}}

五. 结果展示

图的遍历 (深度优先遍历和广度优先遍历)相关推荐

  1. 数据结构(廿六) -- C语言版 -- 图 - 图的遍历 -- 邻接表 - 深度/广度优先遍历/搜索(DFS、BFS)

    内容预览 零.读前说明 一.深度优先遍历 1.1.深度优先的遍历过程 1.2.深度优先的遍历实现代码 二.广度优先遍历 2.1.广度优先的遍历过程 2.2.广度优先的遍历实现代码 三.源码测试效果 3 ...

  2. 三十二、图的创建深度优先遍历(DFS)广度优先遍历(BFS)

    一.图的基本介绍 为什么要有图 前面我们学了线性表和树 线性表局限于一个直接前驱和一个直接后继的关系 树也只能有一个直接前驱也就是父节点 当我们需要表示多对多的关系时, 这里我们就用到了图. 图的举例 ...

  3. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  4. python 遍历_Python手撕广度优先遍历

    在谈广度优先遍历之前,我们需要知道图是什么. 1.图  图(graph)是表示物件与物件之间关系的数学对象,是图论的基本研究对象,图由节点(node)和边(edge)组成.图分为两种:1.有向图.2. ...

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

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

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

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

  7. 图的建立(邻接矩阵)与其深度优先和广度优先遍历

    建立一个有向图或无向图,输入其顶点数,边数,并给出相应边的权值,输出该图对应的邻接矩阵,并用递归实现其深度优先遍历和用队列实现其广度优先遍历后的结果. 图的遍历 从给定图中任意指定的顶点(称为初始点) ...

  8. Java数据结构之图的基本概念和算法,深度优先遍历DFS,广度优先遍历BFS(图解)

    文章目录 前言 一.图的基本概念 1.图的定义 2.基本术语 二.图的基本算法 1.初始化图 2.插入顶点和边 3.矩阵打印 4.返回第一个邻接结点的下标 5.返回第一个邻接结点的下一个结点的下标 三 ...

  9. 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...

  10. 数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

    文章目录 邻接矩阵存储图的广度优先遍历过程分析 C语言实现队列编程 程序中加入图的处理函数 结果的再次分析 C#语言实现图的广度优先遍历.并显示广度优先遍历生成树 JavaScript语言实现图的广度 ...

最新文章

  1. 如何在企业推行OKR?
  2. oracle ORACLE_SID使用上的意义
  3. jQuery之get方法
  4. wegame饥荒一直连接中_23万人捧场热血传奇怀旧版,WeGame拯救计划,前景如何?...
  5. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0......
  6. npm install是什么命令_了解npm
  7. 计算机与英语专业结合的案例,文科生可以申请加拿大计算机专业吗?让这个真实案例给你肯定的答案!...
  8. AndroidStudio中提示:uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in libr
  9. vue框架项目部署到服务器_在浏览器中在线尝试无服务器框架项目!
  10. 苹果手机电越充越少怎么回事_手机充着电,电量缺越来越少是怎么回事?
  11. python matplotlib_高效使用 Python 可视化工具 Matplotlib
  12. 【树莓派】服务配置相关3:基于Ubuntu Server的服务配置
  13. Confluence 6 通过 SSL 或 HTTPS 运行 - 创建或请求一个 SSL 证书
  14. 取消IE“已限制此网页运行可以访问计算机的脚本
  15. TCP Socket
  16. 让人心烦的TIME_WAIT状态与SO_REUSEADDR选项
  17. [No0000151]菜鸟理解.NET Framework中的CLI,CLS,CTS,CLR,FCL,BCL
  18. 记录:zlog交叉编译出aarch64的libzlog.a
  19. RS485总线传输协议
  20. 电力系统分析计算机辅助试题,电力系统计算机辅助分析综合训练实验报告.doc...

热门文章

  1. 怎么用spss做冗余分析_SPSS进行典型相关分析结果总结
  2. 台式计算机进入安全模式蓝屏,电脑进安全模式蓝屏怎么办
  3. Docker 学习笔记
  4. 提权学习:第三方软件提权(FlashFXP 替换文件漏洞提权)
  5. 中班音乐计算机创编,幼儿园中班音乐教学方案创意实用篇
  6. 启动虚拟机异常(超完整版)Win10
  7. 使用FFmpeg截取视频封面图片(完整例子)
  8. 劲爆周鸿祎网络炒作黑幕
  9. E680手机上能用的 MPlayer
  10. win10系统bat隐藏运行的cmd窗口