# Summary
回溯是种写起来简洁的多层for*暴力穷举*搜索,再配合一些剪枝优化。
为啥能写起来简洁,因为用了递归
对于要穷举的树结构,backtrack函数是纵向逻辑,for循环是横向逻辑,最终实现对树结构的穷举
```java
void backtracking(参数) {
// 终止条件
if () {
存放结果;
return;
}
// 处理逻辑
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
```
# Cues
# Notes
| Category | Sub-category | Topic | Related Topic | Notes |
|:------------------ |:---------------- |:------------------- |:---------------------- |:------------------------------------------------------------------------- |
| **回溯 backtracking** | **二叉树回溯** | 15. 二叉树递归中带着回溯 | | |
| | | 13. 二叉树的所有路径 | | |
| | | 18. 路径总和 | JZ82 二叉树中和为某一值的路径(一) | 左右孩子都为空的节点才是叶子节点 |
| | | 113. 路径总和 II | JZ84 二叉树中和为某一值的路径(三) | |
| | | JZ34 二叉树中和为某一值的路径(二) | | |
| | | 27. 二叉树的最近公共祖先 | JZ86 在二叉树中找到两个节点的最近公共祖先 | |
| | | 22. 括号生成 | | |
| | **多层for回溯** | 2. 组合问题 | | |
| | **各种path不等长,重结果** | 7. 组合总和 | 无重复元素的整数数组 | |
| | | 8. 组合总和II | 有重复元素的整数数组 | res里面加path需要深拷贝, res.add(new ArrayList(path))不然只是引用的话, res里的内容会随着path变化而变化 |
| | | 4. 组合总和III | | |
| | | 21. 组合总和Ⅳ | 无限背包 | 组合问题上回溯和背包的区别 |
| | | 11. 子集问题 | | |
| | | 13. 子集II | | 树层去重 |
| | **各种path等长,重方式** | 5. 电话号码的字母组合 | | |
| | | 15. 全排列 | | used数组 |
| | | 16. 全排列II | JZ38 字符串的排列 | 排序+used数组 |
| | | JZ12 矩阵中的路径 | | 深入理解 dfs/深度优先/递归 + 路径技巧 |
| | | 9. 分割回文串 | | |
| | | 10. 复原IP地址 | | |
| | | 12. 回溯周末总结 | | |
| | | 14. 递增子序列 | | |
| | | 17. 回溯周末总结 | | |
| | | 18. 回溯算法去重问题的另一种写法 | | |
| | | 19. 重新安排行程 | | |
| | | 20. N皇后 | | |
| | | 21. 解数独 | | |
| | **图回溯** | 797. 所有可能的路径 | | |
| | | 22. 回溯法总结篇 | | |