DFS与BFS

153 阅读2分钟

深度优先搜索与广度优先搜索算法

深度优先搜索 DFS

深度优先搜索(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。该算法与堆栈有着千丝万缕的关系。DFS算法通常需要用到堆栈结构

DFS算法的思路,是试图穷举全部路径 它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底。这种尽量往深处走的概念即是深度优先的概念。

案例:寻找二叉树中的目标节点。

如下图所示,红色表示死胡同,绿色G表示目标。

  1. 从入口A出发,首先来到第一个分岔口,有B和C两条路,
  2. 遍历B,发现是死胡同,回退到最近的分岔口A,尝试往C方向走;
  3. 遍历C,发现是一个分岔口,有D、E、F三条路,
  4. 遍历D,发现是死胡同,回退到分岔口C,
  5. 遍历E,发现有G一条路,
  6. 遍历G,成功找到目标节点。

广度优先搜索 BFS

BFS 又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止

BFS算法的思路,是逐层遍历,类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶点时,依次遍历其所有的邻接点,然后再从这些邻接点出发,同样依次访问它们的邻接点。按照此过程,直到图中所有被访问过的顶点的邻接点都被访问到。

一般用队列数据结构来辅助实现BFS算法。

如下图所示,遍历过程:

  1. 遍历第2层数据,访问A,有B和C两条路,保存为下一层的遍历数据,清空A数据。
  2. 遍历第2层数据,访问B,发现是死胡同,清空B数据;遍历C,发现D、E、F,保存为下一层的遍历数据,清空C数据;
  3. 遍历第3层数据,访问D,发现是死胡同,清空D数据;遍历E,发现G,保存为下一层的遍历数据,清空E数据,遍历F数据并清空;
  4. 遍历第4层数据,访问G,目标找到。