DFS

解决哪类问题

:::success 在树/图中搜索 :::

代码模板

判出口(终点、越界)->剪枝->扩展->标记->递归->还原

  1. /*
  2. * Return true if there is a path from cur to target.
  3. */
  4. boolean dfs(Node cur, Node target, Set<Node> visited) {
  5. if (cur == target) // 退出条件
  6. return true;
  7. for (Node next: cur.nexts) { // 尝试每一种可能性
  8. if (!visited.contains(next)) { // 未访问
  9. visited.add(next); // 标记访问
  10. if (dfs(next, target, visited)) // 更新结果
  11. return true
  12. // 部分可能有回溯
  13. }
  14. }
  15. return false;
  16. }

复杂度

O(所有节点的规模)

运用思想

递归、迭代、枚举、贪心、回溯、剪枝

例题

题目 难度 推荐指数
17. 电话号码的字母组合 中等 🤩🤩🤩🤩
22. 括号生成 中等 🤩🤩🤩🤩
37. 解数独 困难 🤩🤩🤩🤩
39. 组合总和 中等 🤩🤩🤩🤩
40. 组合总和 II 中等 🤩🤩🤩🤩
211. 添加与搜索单词 - 数据结构设计 中等 🤩🤩🤩🤩🤩
282. 给表达式添加运算符 困难 🤩🤩🤩🤩
301. 删除无效的括号 困难 🤩🤩🤩🤩
310. 最小高度树 中等 🤩🤩🤩🤩🤩
341. 扁平化嵌套列表迭代器 中等 🤩🤩🤩
386. 字典序排数 中等 🤩🤩🤩🤩
397. 整数替换 中等 🤩🤩🤩🤩
403. 青蛙过河 困难 🤩🤩🤩🤩
427. 建立四叉树 中等 🤩🤩🤩🤩
437. 路径总和 III 中等 🤩🤩🤩🤩
488. 祖玛游戏 困难 🤩🤩🤩🤩
494. 目标和 中等 🤩🤩🤩🤩
559. N 叉树的最大深度 简单 🤩🤩🤩🤩
563. 二叉树的坡度 简单 🤩🤩🤩🤩
589. N 叉树的前序遍历 简单 🤩🤩🤩
590. N 叉树的后序遍历 简单 🤩🤩🤩
606. 根据二叉树创建字符串 简单 🤩🤩🤩🤩
638. 大礼包 中等 🤩🤩🤩🤩
653. 两数之和 IV - 输入 BST 简单 🤩🤩🤩🤩
677. 键值映射 中等 🤩🤩🤩🤩
690. 员工的重要性 简单 🤩🤩🤩
778. 水位上升的泳池中游泳 困难 🤩🤩🤩
783. 二叉搜索树节点最小距离 简单 🤩🤩🤩
869. 重新排序得到 2 的幂 中等 🤩🤩🤩🤩
872. 叶子相似的树 简单 🤩🤩🤩
938. 二叉搜索树的范围和 简单 🤩🤩🤩
987. 二叉树的垂序遍历 困难 🤩🤩🤩🤩🤩
993. 二叉树的堂兄弟节点 简单 🤩🤩
1239. 串联字符串的最大长度 中等 🤩🤩🤩
1609. 奇偶树 中等 🤩🤩🤩🤩🤩
1723. 完成所有工作的最短时间 困难 🤩🤩🤩
1766. 互质树 困难 🤩🤩🤩🤩
2044. 统计按位或能得到最大值的子集数目 困难 🤩🤩🤩🤩

题目 难度 推荐指数
310. 最小高度树 中等 🤩🤩🤩🤩🤩
403. 青蛙过河 困难 🤩🤩🤩🤩
417. 太平洋大西洋水流问题 中等 🤩🤩🤩🤩🤩
778. 水位上升的泳池中游泳 困难 🤩🤩🤩
797. 所有可能的路径 中等 🤩🤩🤩🤩
863. 二叉树中所有距离为 K 的结点 中等 🤩🤩🤩🤩
1020. 飞地的数量 中等 🤩🤩🤩
1034. 边界着色 中等 🤩🤩🤩🤩
1723. 完成所有工作的最短时间 困难 🤩🤩🤩
1766. 互质树 困难 🤩🤩🤩🤩
2049. 统计最高分的节点数目 中等 🤩🤩🤩🤩
LCP 07. 传递信息 简单 🤩🤩🤩🤩