注意点
- 参数能加引用就加引用,不能就用全局变量,要不然递归一次拷贝一次数据
- 2096. 从二叉树一个节点到另一个节点每一步的方向
模板
void backtracking(参数){
if(终止条件){
//存放结果
return;
}
for(遍历本层){
//处理节点
//递归回溯
//撤销回溯
}
}
去重、选择
每个元素只能用一次加startIndex,去重用used[]
如果要对树层中前一位去重,就用used[i - 1] == false,如果要对树枝前一位去重用used[i - 1] == true。
分类
- 组合问题:N个数里面按一定规则找出k个数的集合
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 棋盘问题:N皇后,解数独等等
但是要清楚子集问题和组合问题、分割问题的的区别,子集是收集树形结构中树的所有节点的结果。
而组合问题、分割问题是收集树形结构中叶子节点的结果。
返回值
如果需要搜索整颗二叉树,那么递归函数就不要返回值
如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。