96题-不同的二叉搜索树

1.1题目

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:

1.2解答

最开始我是想到将1..n分别作为根节点,其左右的数就是左右子树,那么以n为根节点的树的种类数就等于左子树种类数乘右子树种类数,只需要一个递归调用就能解决问题。然后就是通过构建备忘录表实现空间复杂度的降低。也就是动态规划。当然我这使用的是由上至下的方法(n开始)。也可一使用由下至上的方法(1开始)。

1.3代码

暴力递归

package solution;
import java.util.Arrays;
import java.util.Comparator;

/**
 * @author xgj
 */
public class Solution {

    public int numTrees(int n) {
        int count = 0;
        if(n<2) return 1;
        for(int i = 0 ; i < n ;++i){
            count+=numTrees(i-0)*numTrees(n-i-1);
        }
        return count;
    }

}

动态规划

package solution;


import java.util.Arrays;
import java.util.Comparator;

/**
 * @author xgj
 */
public class Solution {
    private int[] dp;

    public int numTrees(int n) {
        dp = new int[n+1];
        return numTrees(n,dp);

    }
    public int numTrees(int n,int[] dp) {
        if(dp[n]!=0) return dp[n];
        if(n < 2){
            dp[n]=1;
            return dp[n];
        }
        for(int i = 0 ; i < n ;++i){

            dp[n]+=numTrees(i-0,dp)*numTrees(n-i-1,dp);
        }
        return dp[n];

    }
}

猜你喜欢

转载自www.cnblogs.com/jiezao/p/13369911.html