深度优先搜索是一种⭐枚举⭐所有完整路径以遍历所有情况的搜索方法(暴力)考难点也就是考应用型DFS+剪枝+回溯
问题的引出
问题的解决
递归的问题,无不就是递归式和递归边界的问题。
背包问题
一类常见的DFS问题的解决方法(选择型DFS)
DFS典型例题
1. 树型的DFS题
基于树的DFS题,考察点主要是体现在二叉树的前序、中序和后序遍历上。万变不离其中,都会有下面这几行代码:
dfs(root->left)
...
dfs(root->right)
...
- 【树的递归封装思想】114. Flatten Binary Tree to Linked List
- ⭐⭐⭐⭐⭐【中序遍历、验证二叉搜索树】98. Validate Binary Search Tree
- ⭐⭐⭐⭐⭐101. Symmetric Tree
- 【树的DFS、水题】104. Maximum Depth of Binary Tree
- 【序列坐标+二叉树型DFS】105. Construct Binary Tree from Preorder and Inorder Traversal
2. 图型DFS题
图型DFS题主要需要注意设置一个bool
数组vis
来检测是否已经别访问过了,因为图是可能有环的呀~~~所以要避免死循环呢
- ⭐⭐⭐⭐⭐【图的DFS进阶】最小路径串(这道题在普通的图DFS上加了遍历的优先级,nice)
- ⭐⭐⭐⭐⭐【图的遍历】POJ 1129 Channel Allocation(其实应该不算DFS题。。。)
- 更多题目见图专题
3. 网格型DFS题
这种题目的典型形式就是给定一个网格,然后让你在网格上走来走去,从未满足一个条件之后退出DFS。
这类题目的主要套路有:
- 可能要设置
dir
数组; - DFS函数可能需要返回
bool
值,需要对bool
值进行判断; - DFS函数可能需要剪枝;
- DFS函数里面可能有回溯的操作;
- LeetCode 200. Number of Islands
- LeetCode 130. Surrounded Regions
- ⭐⭐⭐⭐⭐【网格型、暴力、DFS典型例题】POJ 2488 A Knights Journey
- ⭐⭐⭐⭐⭐【网格型DFS】POJ 2676 Sudoku
- ⭐⭐⭐⭐⭐【网格型DFS+BFS最短路究极版本】POJ 3083 Children of the Candy Corn
4. 应用型且思维量大型DFS
这类题目通常需要一个很强的思维逻辑能力,能够从实际问题中抽取出DFS函数,这类题目有一些特点:
- DFS函数中 通常要传递数组下标;
- DFS函数一般为
bool
型返回值函数; - 一定会考剪枝!
- 也可能会考察回溯!
- ⭐⭐⭐⭐⭐【应用型DFS+剪枝】A - Sticks 这里的剪枝骚的1p
- ⭐⭐⭐⭐⭐POJ 2362 Square里面有代码细节我写错了
5. 记忆化搜索型DFS
一种通过花费空间来节省时间的DFS,其实也算是一种剪枝,只不过这个剪枝是通过dp
数组来实现的,可以说是动态规划的一种吧~