当前位置:网站首页>深度优先遍历(Depth First Search, 简称 DFS)
深度优先遍历(Depth First Search, 简称 DFS)
2022-07-17 05:20:00 【爱编程的西瓜】
正文开始:
深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。
前言
深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在 leetcode,高频面试题中。
本文将会从以下几个方面来讲述深度优先遍历,广度优先遍历,相信大家看了肯定会有收获。
深度优先遍历
- 深度优先遍历简介
- 习题演练
- DFS,BFS 在搜索引擎中的应用
深度优先遍历简历
主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底…,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。
树是图的一种特例(连通无环的图就是树),接下来我们来看看树用深度优先遍历该怎么遍历。

1、我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。

2、上图中一条路已经走到底了(9是叶子节点,再无可遍历的节点),此时就从 9 回退到上一个节点 5,看下节点 5 是否还有除 9 以外的节点,没有继续回退到 2,2 也没有除 5 以外的节点,回退到 1,1 有除 2 以外的节点 3,所以从节点 3 开始进行深度优先遍历,如下:
3、同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点,再往上回溯,发现 3 有除 6 以外的子点 7,所以此时会遍历 7。

4、从 7 往上回溯到 3, 1,发现 1 还有节点 4 未遍历,所以此时沿着 4, 8 进行遍历,这样就遍历完成了。
完整的节点的遍历顺序如下(节点上的的蓝色数字代表):

相信大家看到以上的遍历不难发现这就是树的前序遍历,实际上不管是前序遍历,还是中序遍历,亦或是后序遍历,都属于深度优先遍历。
那么深度优先遍历该怎么实现呢,有递归和非递归两种表现形式,接下来我们以二叉树为例来看下如何分别用递归和非递归来实现深度优先遍历。
1、递归实现
递归实现比较简单,由于是前序遍历,所以我们依次遍历当前节点,左节点,右节点即可,对于左右节点来说,依次遍历它们的左右节点即可,依此不断递归下去,直到叶节点(递归终止条件),代码如下:
public class Solution {
private static class Node {
/**
* 节点值
*/
public int value;
/**
* 左节点
*/
public Node left;
/**
* 右节点
*/
public Node right;
public Node(int value, Node left, Node right) {
this.value = value;
this.left = left;
this.right = right;
}
}
public static void dfs(Node treeNode) {
if (treeNode == null) {
return;
}
// 遍历节点
process(treeNode)
// 遍历左节点
dfs(treeNode.left);
// 遍历右节点
dfs(treeNode.right);
}
}
递归的表达性很好,也很容易理解,不过如果层级过深,很容易导致栈溢出。所以我们重点看下非递归实现。
2、非递归实现
仔细观察深度优先遍历的特点,对二叉树来说,由于是先序遍历(先遍历当前节点,再遍历左节点,再遍历右节点),所以我们有如下思路:
对于每个节点来说,先遍历当前节点,然后把右节点压栈,再压左节点(这样弹栈的时候会先拿到左节点遍历,符合深度优先遍历要求)。
弹栈,拿到栈顶的节点,如果节点不为空,重复步骤 1, 如果为空,结束遍历。
我们以以下二叉树为例来看下如何用栈来实现 DFS。
整体动图如下:
整体思路还是比较清晰的,使用栈来将要遍历的节点压栈,然后出栈后检查此节点是否还有未遍历的节点,有的话压栈,没有的话不断回溯(出栈),有了思路,不难写出如下用栈实现的二叉树的深度优先遍历代码:
/**
* 使用栈来实现 dfs
* @param root
*/
public static void dfsWithStack(Node root) {
if (root == null) {
return;
}
Stack<Node> stack = new Stack<>();
// 先把根节点压栈
stack.push(root);
while (!stack.isEmpty()) {
Node treeNode = stack.pop();
// 遍历节点
process(treeNode)
// 先压右节点
if (treeNode.right != null) {
stack.push(treeNode.right);
}
// 再压左节点
if (treeNode.left != null) {
stack.push(treeNode.left);
}
}
}
可以看到用栈实现深度优先遍历其实代码也不复杂,而且也不用担心递归那样层级过深导致的栈溢出问题。
结尾
这就是我理解的深度优先遍历算法啦,如果有不太对的地方,欢迎指出,谢谢。
边栏推荐
- 2022/07/12 学习笔记 (day05)循环
- 2022/07/09 第五小组 丁帅 学习笔记 day02
- 第五章 我们可以直接调用run()方法来启动一个新线程吗
- 2022/07/14 learning notes (day07) array
- 【力扣】另一棵树的子树
- [bjoi2019] platoon formation (Group backpack)
- SeaChest Utilities 工具,让你的硬盘功耗又低又长寿
- Color histogram grayscale image & color image
- 2022 robocom world robot developer competition - undergraduate group (provincial competition)
- Positional Change of the Eyeball During Eye Movements: Evidence of Translatory Movement眼球运动过程中眼球的位
猜你喜欢

數學基礎課2_歐拉函數,線性篩,擴歐

使用候选选择从人类注视中学习视频显著性

2022/07/11 第五小组 丁帅 学习笔记 day04

视图、索引文件的应用

2022/07/10 group 5 Ding Shuai's study notes day03

Basic mathematics course 2_ Euler function, linear sieve, extended Euler
![[force buckle] symmetric binary tree](/img/a4/31e936fb242aa8a3243ea257f5fd29.png)
[force buckle] symmetric binary tree

基于视觉显著性的外观注视估计

Salgaze: personalized gaze estimation using visual saliency

Mapping index attribute & operation of creating index
随机推荐
山西省第二届网络安全技能大赛(企业组)部分赛题WP(二)
Positional Change of the Eyeball During Eye Movements: Evidence of Translatory Movement眼球运动过程中眼球的位
通过VOR深度估计解决三维注视交互中的目标模糊问题
Handle Chinese word segmentation IK word segmenter and expand and stop dictionary
Learning non posture gaze deviation with head movement
Robot stitching gesture recognition and classification
工作中遇到的一些问题
Busybox specified date modification temporarily does not require clock -w to write to hardware
【力扣】二叉树的最大深度
感知智能手机上用户的关注状态
Manjaro 系统日常使用入门导引
虚拟现实中的眼睛跟踪
实验五: GUI
WebService接口的创建与实现
[force buckle] ring list II
浅谈跨域的几种解决方案
SalGaze:使用视觉显著性的个性化注视估计
2022/07/09 group 5 Ding Shuai's study notes day02
通過VOR深度估計解决三維注視交互中的目標模糊問題
[usaco06dec]the fewest coins g (hybrid backpack)