跳到主要内容

深度优先搜索(dfs)算法之一——基础

1.1 深度优先搜索(dfs)定义

深度优先搜索(Depth-First Search)是图的一种搜索方式,以深度为优先级去进行搜索,通俗地说就是"不撞南墙不回头",对于当前正在搜索的路径而言,只有把当前路径给搜索完了,即走到无路可走时,才回返回进而搜索另一条路。

1.2 深度优先搜索(dfs)算法思想

深度优先搜索DFS动图

深度优先搜索是图的一种搜索方式,如上图所示,以深度为优先级去进行搜索,通俗地说就是"不撞南墙不回头",或者"一条路走到黑"——对于当前正在搜索的路径而言,只有把当前路径给搜索完了,即走到无路可走时,才回返回进而搜索另一条路。 深度优先搜索一般是通过递归来实现的,“递”的过程就是往下搜的过程对应着深度,“归”的过程就是回溯,回退上一级

DFS 不仅仅可以搜索图,还可以搜索树,搜索所有可以转换、抽象为图的数据结构。

假设我们有一个共有10个节点的二叉树,以下是DFS的搜索过程:

深度优先搜索DFS过程示意图
1、从根节点开始向下搜索

深度优先搜索DFS过程示意图
2、搜索到2号节点 深度优先搜索DFS过程示意图
3、搜索到4号节点 深度优先搜索DFS过程示意图
4、搜索到7号节点 深度优先搜索DFS过程示意图
5、回溯到4号节点 深度优先搜索DFS过程示意图
6、回溯到2号节点 深度优先搜索DFS过程示意图
7、搜索到5号节点 深度优先搜索DFS过程示意图
8、搜索到8号节点 深度优先搜索DFS过程示意图
9、回溯到5号节点 深度优先搜索DFS过程示意图
10、搜索到9号节点,回溯到5号节点,回溯到2号节点,回溯到1号节点 深度优先搜索DFS过程示意图
11、搜索到3号节点 深度优先搜索DFS过程示意图
12、在逐层回溯到1号根节点

根据以上图示,可以分析出DFS的搜索过程是一个递归的过程,递归的过程就是往下搜的过程,回溯的过程就是回退上一级的过程。

深搜作为一种算法来说,并没有像二分、堆、快速排序等这些算法有固定的模板,它更像是一种思想。

1.3、基本模板框架

我们可以总结一个基本的DFS算法框架如下:

void dfs( int root){ //root 为起始节点
visit(root); //访问根节点
for( int i = 0; i < root->child.size(); i++){
dfs(root->child[i]); //递归访问子节点
}
}

int main(){
//建立树
dfs(root);
return 0;
}

*学习笔记

暂没有学习笔记,快来抢first blood !