深度优先搜索与广度优先搜索算法
深度优先搜索 DFS
深度优先搜索(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。该算法与堆栈有着千丝万缕的关系。DFS算法通常需要用到堆栈结构
DFS算法的思路,是试图穷举全部路径 它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底。这种尽量往深处走的概念即是深度优先的概念。
案例:寻找二叉树中的目标节点。
如下图所示,红色表示死胡同,绿色G表示目标。
- 从入口A出发,首先来到第一个分岔口,有B和C两条路,
- 遍历B,发现是死胡同,回退到最近的分岔口A,尝试往C方向走;
- 遍历C,发现是一个分岔口,有D、E、F三条路,
- 遍历D,发现是死胡同,回退到分岔口C,
- 遍历E,发现有G一条路,
- 遍历G,成功找到目标节点。
广度优先搜索 BFS
BFS 又译作宽度优先搜索,或横向优先搜索,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
BFS算法的思路,是逐层遍历,类似于树的层次遍历。从图中的某一顶点出发,遍历每一个顶点时,依次遍历其所有的邻接点,然后再从这些邻接点出发,同样依次访问它们的邻接点。按照此过程,直到图中所有被访问过的顶点的邻接点都被访问到。
一般用队列数据结构来辅助实现BFS算法。
如下图所示,遍历过程:
- 遍历第2层数据,访问A,有B和C两条路,保存为下一层的遍历数据,清空A数据。
- 遍历第2层数据,访问B,发现是死胡同,清空B数据;遍历C,发现D、E、F,保存为下一层的遍历数据,清空C数据;
- 遍历第3层数据,访问D,发现是死胡同,清空D数据;遍历E,发现G,保存为下一层的遍历数据,清空E数据,遍历F数据并清空;
- 遍历第4层数据,访问G,目标找到。