递归树
一.情景一
假设有一个bool类型的数组 choices, 每个元素只有true和false两种状态可选
求:所有的组合情况 ,由排列组合可知道 有 2x2x2=8种情况
代码如下
public class Main { public static void main(String[] args) { boolean[] c = new boolean[3]; dfs(0,c); } private static void dfs(int l,boolean[] choices){ if(l==choices.length){ for (int i = 0; i < choices.length; i++) { System.out.print(choices[i]+" "); } System.out.println(); return; } choices[l] = false; //不选 dfs(l+1,choices); choices[l] = true; dfs(l+1,choices); //选 } }
输出:
false false false false false true false true false false true true true false false true false true true true false true true true
二.情景一的递归树分析
因为bool 只有两种情况,所以递归树就成了一棵二叉树
所以每条路径就是结果
同二叉树的前中序遍历其实类似
回顾一下前中序遍历的代码
//前序遍历 void preOrder(TreeNode root){ if(root==null) { return; } System.out.print(root.val+" "); preOrder(root.left); preOrder(root.right); } //中序遍历 void midOrder(TreeNode root){ if(root==null) { return; } midOrder(root.left); System.out.print(root.val+" "); midOrder(root.right); }
可以将下面代码看成分支的选择,即不同的状态的分支即可
choices[l] = false; //不选 dfs(l+1,choices); choices[l] = true; dfs(l+1,choices); //选
三.例子,递归实现指数型枚举
题源:https://www.acwing.com/problem/content/94/
思路和上面的情景一一样
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String buf = reader.readLine(); int n = Integer.parseInt(buf); int[] states = new int[n+1]; dfs(n,1,states); } private static void dfs(int n,int u,int[] states ){ if(u == n+1){ for (int i = 1; i <=n ; i++) { if(states[i] == 1){ System.out.print(i+" "); } } System.out.println(); return; } states[u]=2; dfs(n,u+1,states); states[u]=0; states[u]=1; dfs(n,u+1,states); states[u]=0; } }
四: 例子的递归树分析
由递归树的路径可知
输出为:
[]
[3]
[2]
[2,3]
[1]
[1,3]
[1,2]
[1,2,3]