# 总结 使用场景: - 如果解决一个问题需要多个步骤,而每个步骤有多个可能的结果,题目又要求我们找出所有可能的结果,那么这个时候可以考虑回溯法。 - 回溯法本质是在一棵树上进行深度优先遍历 算法设计: 关键就是要学会分析和画图,然后确定传入参数。只要传入参数确定了代码框架就确定了 (返回值一般是 `void`): - 得有一个 `&result` 来存放结果 - 每一层的节点所包含的数据是什么,需要一系列的参数来描述当前节点的状态(传入的参数实际上是上一轮迭代的数据)。 - 终止条件是什么?回溯法中的每个节点并不是真的树状节点,没有 `nullptr` ,因此用空指针来判断是否到了叶子结点并不合理,需要其它的一些方法来确定是否到达叶子节点,比如高度。 - 每次迭代要在上一次迭代的基础上进行哪些操作?需要哪些参数才能完成这些操作? 复杂度分析: - 时间复杂度:最长路径长度 × 搜索树的节点数 - 空间复杂度:一个节点所需要的空间 × 搜索树的节点数 分类: - 组合问题:N 个数里面按一定规则找出 k 个数的集合 - 切割问题:一个字符串按一定规则有几种切割方式 - 子集问题:一个 N 个数的集合里有多少符合条件的子集 - 排列问题:N 个数按一定规则全排列,有几种排列方式 - 棋盘问题:N 皇后,解数独等等