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

Wesley13
• 阅读 875

DFS (Deep First Search)

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

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

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

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

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

下面是图解:

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

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

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

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

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

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

DFS的伪代码:

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

BFS (Breadth First Search)

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

图解:

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

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

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

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

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

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

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

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

可以看出,这样放射性的寻找方式,能找到从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入对列;

            }

        }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
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
九路 九路
3年前
前端学数据结构与算法:二叉树的四种遍历方式及其应用
前言上一章我们从0到1的实现了一颗二叉搜索树,以及理解了二叉搜索树的特性与基本操作,这一章介绍关于二叉树的更多操作,也就是树的遍历,对树的每个节点进行访问。主要包括前序遍历、中序遍历、后序遍历、层序遍历,前面三种也叫深度优先遍历(DFS),最后的层序遍历也叫广度优先遍历(BFS),理解这四种遍历方式的不同,再遇到树相关的算法问题时,也就能更加游刃有余。这
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Wesley13 Wesley13
3年前
C语言数据结构之图的基本操作
本博文是是博主在学习数据结构图的这一章知识时做的一些总结,代码运行环境:visualstudio2017纯C语言,当然掌握了方法,你也可以试着用其它的语言来实现同样的功能。下面的程序主要实现了对有向图,有向网,无向图,无向网,无向图的深度优先遍历,广度优先遍历,有向无环图的拓扑排序功能等。主要代码实现如下:1pragmao
Wesley13 Wesley13
3年前
Java的编程逻辑
1、run()和start()的区别2、线程的基本属性和方法1.id:一个递增的整数,每创建一个线程就加一2.name3.优先级:从1到10,默认为5,会映射到系统中的优先级。数字越大,要优先级越高4.状态: NEW:还没调用start RUNABLE:正在执行run或者正在等待cup分配
Wesley13 Wesley13
3年前
JAVA递归实现线索化二叉树
JAVA递归实现线索化二叉树基础理论首先,二叉树递归遍历分为先序遍历、中序遍历和后序遍历。先序遍历为:根节点左子树右子树中序遍历为:左子树根节点右子树后序遍历为:左子树右子树根节点(只要记住根节点在哪里就是什么遍历,且都是先左再右)线索化现在有这么一棵二叉树,它的数据结
Stella981 Stella981
3年前
Leetcode之深度优先搜索(DFS)专题
Leetcode之深度优先搜索(DFS)专题200.岛屿数量(NumberofIslands)深度优先搜索的解题详细介绍,点击(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.cnblogs.com%2Fqinyuguan%2Fp%2F11330303.html)
菜园前端 菜园前端
1年前
什么是图?
原文链接:什么是图?图是网络结构的抽象模型,是一组由边连接的节点。图可以表示任何二元关系,比如道路、航班等。在JavaScript中没有图,但是可以通过Object和Array来构建图。常用操作深度优先遍历广度优先遍历图的表示法邻接矩阵邻接表关联矩阵...
菜园前端 菜园前端
1年前
什么是堆?
原文链接:什么是堆?堆是一种特殊的完全二叉树。完全二叉树的含义就是每层节点都完全填满,除了最后一层外只允许最右边缺少若干个节点。在JavaScript中通常用数组表示堆(按照广度优先遍历顺序)。最大堆最小堆特性所有的节点都大于等于它的子节点(最大堆)或者所