DFS(深度优先遍历) 以及 BFS(广度优先遍历)

DFS (Deep First Search)

概念:
    顾名思义,这种遍历方法是以深度为优先进行对图的搜索或者遍历,至于什么是以深度为优先条件,先看下面DFS的基本步骤:

   ( 这是一个递归思想的DFS)

    DFS:从当前节点开始,先标记当前节点,再寻找与当前节点相邻,且未标记过的节点:

        (1): 当前节点不存在下一个节点,则返回前一个节点进行DFS

        (2): 当前节点存在下一个节点,则从下一个节点进行DFS

下面是图解:

    一开始,可以看出,若没有走到死路,这种遍历方式会从start节点沿着一条路一直深入下去(start -> 1 -> 2 -> 3。

若走到死路,便会退回上一节点,遍历上一节点的其他相邻节点(2 -> 4)。

 

这样一直重复,直到找到终点。

DFS的伪代码:

  find(节点){             if(此结点已经遍历 || 此节点在图外 || 节点不满足要求) return;             if(找到了end节点) 输出结果 ; return;             标记此节点,表示已经遍历过了;             while(存在下一个相邻节点) find(下一个节点);         }

BFS (Breadth First Search)

概念:
    对于深度优先算法,强迫症就很不爽了,并表示:“为什么不干干净净,一层一层地从start节点搜索下去呢,就像病毒感染一样,这样才像正常的搜索的样子嘛。”于是便有了BFS算法(误)。广度优先算法便如其名字,它是以广度为优先的,一层一层搜索下去的,就像病毒感染,扩散性的传播下去。

图解:

    下图中,start为搜索的初始节点,end为目标节点

我们先把star节点的关联节点遍历一次

接下来把第一步遍历过的节点当成start,重复第一步

  重复一二步,这样便是一个放射样式的搜哦防范,直到找到end节点

可以看出,这样放射性的寻找方式,能找到从start到end的最近路(因为每次只走一步,且把所有的可能都走了,谁先到end说明这就是最短路)。怎么实现呢?

    这里需要用到队列:

    a. 比如每遍历start周围的一个“1”节点的时候,就把跟它相关联的“2”节点保存到队列中(“1”节点访问完之后队列内容:2,2,2,2)

    b. 然后依次访问队列内容,并对每个队列元素重复a步骤(访问一个“2”节点之后队列的内容:2,2,2,3,3)。

    c. 由此重复下去,直到队列为空或者搜索到终点。

广度优先的[递归]伪代码:

      把start节点push入队列;         while(队列不为空) {             把队列首节点pop出队列;             对节点进行相关处理或者判断;             while(此节点有下一个相关节点){                 把相关节点push入对列;             }         }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

前端学数据结构与算法:二叉树的四种遍历方式及其应用

前言上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历,对树的每个节点进行访问。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这

PPDB:今晚老齐直播

【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。

C语言数据结构之图的基本操作

本博文是是博主在学习数据结构图的这一章知识时做的一些总结,代码运行环境:visualstudio2017纯C语言,当然掌握了方法,你也可以试着用其它的语言来实现同样的功能。下面的程序主要实现了对有向图,有向网,无向图,无向网,无向图的深度优先遍历,广度优先遍历,有向无环图的拓扑排序功能等。主要代码实现如下:1pragmao

DFS(深度优先遍历) 以及 BFS(广度优先遍历) - HelloWorld