深度优先搜索(Depth-First Search)和广度优先搜索(Breadth-First Search)都是对图进行搜索的算法,两者都是从起点开始顺着边搜索,直到找到结果为止,区别在于两者的搜索方式略有差别。

1 深度优先搜索(DFS)

    深度优先搜索是搜索算法的一种,它从某一个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解。
    深度优先搜索在搜索到一个新的节点时,立即对该新节点进行遍历。因此遍历需要用先入后出的栈来实现,也可以通过与栈等价的递归来实现。对于树结构而言,由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进。
    下面举例了一个用栈实现的二叉树的深度优先搜索过程。

用深度优先搜索方式遍历二叉树的所有节点,假设左枝优先于右枝,则从根节点1开始,节点的遍历顺序为1,2,4,8,5,3,6,7,9

    (1)从根节点1开始搜索,用一个先进后出的栈实现其过程

    (2)根节点1入栈

    (3)找出一个与该节点邻接且尚未遍历的节点,然后入栈,依次进行



    (4)如果当前节点没有尚未遍历的邻接节点,则将此节点出栈,再执行(3)步骤



    (5)直到遍历完所有节点,将栈中的元素清空,深度优先搜索完成


    深度优先搜索可以用来帮助检测环路:记录每个遍历过的节点的父节点,若一个节点被再次遍历且父节点不同,则说明有环。也可以用拓扑排序判断是否有环路,若最后存在入度不为零的点,则说明有环。 在用深度优先搜索时,有时需要对已经搜索过的节点进行标记,以防止在遍历过程中重复搜索某个节点,这种方法叫状态记录或记忆化(memoization)

2 广度优先搜索(BFS)

    广度优先搜索又称宽度优先搜索,也是搜索算法的一种,它与深度优先搜索类似,从某个状态出发,搜索所有可以到达的状态。不同于深度优先搜索的是,广度优先搜索是一层层进行遍历的,因此需要用先入先出的队列而非先入后出的栈进行遍历。由于是按层次进行遍历,广度优先搜索时按照“广”的方向进行遍历的,也常常用来处理最短路径等问题。
    下面举例了一个用队列实现的二叉树的广度优先搜索过程。

用广度优先搜索方式遍历二叉树的所有节点,假设左枝优先于右枝,则从根节点1开始,节点的遍历顺序为1,2,3,4,5,6,7,8,9

    (1)从根节点1开始搜索,用一个先进先出的队列实现其过程

    (2)根节点1存入队列

    (3)找出所有与该节点邻接且尚未遍历的节点,然后存入队列


    (4)节点1的所有邻居都已被遍历,将其出队列,然后继续(3)步骤





    (4)直到遍历完所有节点,将队列中的元素清空,广度优先搜索完成

3 总结

    深度优先搜索和广度优先搜索都是常用的图搜索算法,深度优先搜索和广度优先搜索都可以处理可达性问题,即从一个节点开始是否能达到另一个节点,以上两个例子都是在无向图的二叉树中进行的DFS和BFS过程,有向图的深度优先搜索和广度优先搜索还需要考虑边的方向。深度优先搜索常用栈或递归的方式实现,广度优先搜索常用队列的方式实现

深度优先搜索(DFS)与广度优先搜索(BFS)相关推荐

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

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

  2. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  3. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  4. 【蓝桥杯】2015决赛A组 5 穿越雷区(深度优先搜索dfs、广度优先搜索bfs)

    历届试题 穿越雷区 问题描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征), ...

  5. 树的前序、中序、后序遍历及深度优先算法DFS、广度优先算法BFS及python实现

    刷Leetcode时遇到一种经典数据结构--树,树是典型递归思想来的,学习树有助于学习递归思想以及栈.队列(后续细说),本文对树的结构.遍历算法以及Python实现做总结,以供复习拓展 树是连通的无环 ...

  6. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

  7. 深度优先搜索(DFS)和广度优先搜索(BFS)探究

    附BFS解题代码: #include<iostream> #include<queue> using namespace std;char room[23][23]; int ...

  8. 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

    遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...

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

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

  10. 深度优先搜索遍历与广度优先搜索遍历

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

最新文章

  1. Global.asax
  2. 设计模式 之 命令模式
  3. Spark任务提交底层原理
  4. 第一期赠书活动《硅谷百年史》已寄出
  5. Python:基础操作(2)
  6. C语言的编译器常见的有哪些?
  7. 安装hmmlearn
  8. PHP面向对象相关特性
  9. vSphere系列二 ---VMware vSphere Client安装
  10. corntab主调度脚步
  11. 少量数据通过Excel表格数据导入server SqlServer查询
  12. IT服务管理(一)服务的演变与整体观
  13. oracle中查看锁表,ORACLE中查看当前系统中锁表情况
  14. 【渝粤教育】国家开放大学2018年春季 7389-21T劳动与社会保障法 参考试题
  15. AQS源码解析 7.共享模式_CyclicBarrier重复屏障
  16. android中涉及的字体修改
  17. mldonkey系列之三──Ini文件[zt]
  18. operator framework搭建operator开发环境
  19. 上海车展:深蓝汽车首次亮相,全场景电动出行实力圈粉
  20. python 处理xls

热门文章

  1. Verilog乘法器
  2. javascript 元旦倒计时的代码
  3. 怎么不让好友看到我在玩的QQ小程序游戏?
  4. 为什么选择预付费表? 安科瑞 戈静怡
  5. 标题:哪天返回 小明被不明势力劫持。后被扔到x星站再无问津。小明得知每天都有飞船飞往地球,但需要108元的船票,而他却身无分文。 他决定在x星战打工。好心的老板答应包食宿,第1天给他1元钱。
  6. [网络流24题] COGS 运输问题1
  7. 7位双极性序列 matlab,移动通信课程设计直接序列扩频系统仿真
  8. 一文读读懂SVM推导全过程
  9. 如何用一个U盘制作winPE、windows、linux、deepin多系统启动盘,并且剩余部分还能继续当U盘使用
  10. 怎么取消此电脑中的百度网盘图标?