ningendo

递归树

一.情景一

    假设有一个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]

posted on 2021-05-26 19:11  Lunamonna  阅读(193)  评论(0编辑  收藏  举报

导航