递归树

一.情景一

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

上一篇:Oracle Database Concepts:介绍模式对象(Introduction to Schema Objects)


下一篇:oracle linux 6.3安装图形界面软件