拿一道题
力扣面试题 04.09. 二叉搜索树序列
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素) {
处理结点;
backtracking(路径,选择列表)); // 递归
回溯,撤销处理结果;
}
}
力扣里面的图
下面的算法中,level是候选结点数组,path是当前路径。
package likou.jindian;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
/**
* @author: Tangxz
* @email: 1171702529@qq.com
* @cate: 2020/12/18 09:35
*/
public class _04_09 {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> BSTSequences(TreeNode root) {
if (root == null) {
res.add(new ArrayList());
return res;
}
//下一个可选择的结点集合
ArrayDeque<TreeNode> level = new ArrayDeque<>();
//当前遍历过的节点值集合,当前答案需要的每一个子集合
ArrayDeque<Integer> path = new ArrayDeque<>();
//当前有一个选择,root
level.add(root);
//开始dfs遍历
dfs(level, path);
return res;
}
private void dfs(ArrayDeque<TreeNode> level, ArrayDeque<Integer> path) {
//如果没有选择了,即遍历完成,就直接存入
if (level.isEmpty()) {
res.add(new ArrayList<>(path));
}
int n = level.size();
//当前所有的可能,递归下去。分散下去,深度优先
for (int i = 0; i < n; i++) {
TreeNode cur = level.poll();//返回最顶上的
//下面三行的操作将在最后回退
path.add(cur.val);
//把下一步可选择的值,存入level中
if (cur.left != null) level.add(cur.left);
if (cur.right != null) level.add(cur.right);
//
dfs(level, path);
//回退候选结点
if (cur.right != null) level.pollLast();
if (cur.left != null) level.pollLast();
path.pollLast(); //把cur给移出path
//把cur放入候选结点。
level.add(cur);
}
}
}