二叉树回溯全排列:
//回溯树型全排列
public static void dfs(TreeNode currentNode, List<Integer> templist, List<List<Integer>> result) {
if (currentNode == null) {
return;
}
templist.add(currentNode.val);
if (currentNode.left == null && currentNode.right == null) {
result.add(new ArrayList<>(templist));
templist.remove(templist.size() - 1);
return;
}
dfs(currentNode.left, templist, result);
dfs(currentNode.right, templist, result);
templist.remove(templist.size() - 1);
}
多叉树型全排列+剪枝(各种类型的剪枝只需要不同条件的continue就行)
//多叉树型全排列+剪枝
public static void btree(int[] arr, boolean[] used, List<Integer> templist, List<List<Integer>> result) {
if (templist.size() == arr.length) {
result.add(new ArrayList<>(templist));
return;
}
for (int i = 0; i < arr.length; i++) {
if (used[i]) {
continue;
}
if (i > 0 && arr[i - 1] == arr[i] && !used[i - 1]) {
continue;
}
used[i] = true;
templist.add(arr[i]);
btree(arr, used, templist, result);
templist.remove(templist.size() - 1);
used[i] = false;
}
}
不需要剪枝的全排列模板
//无重复全排列
public static void btreetest(int[] arr, List<Integer> templist, List<List<Integer>> result) {
if (templist.size() == arr.length) {
result.add(new ArrayList<>(templist));
return;
}
for (int i = 0; i < arr.length; i++) {
if (templist.contains(arr[i])) {
continue;
}
templist.add(arr[i]);
btreetest(arr, templist, result);
templist.remove(templist.size() - 1);
}
}
使用时需要把问题抽象成对应的树,选择合适的树,看是否需要减枝。最后再套模板,debug的时候最好能跟一下,看看程序里到底是怎么执行递归的,有助于你在遇到复杂问题时更好的剪枝。