给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
最开始我是想到将1..n分别作为根节点,其左右的数就是左右子树,那么以n为根节点的树的种类数就等于左子树种类数乘右子树种类数,只需要一个递归调用就能解决问题。然后就是通过构建备忘录表实现空间复杂度的降低。也就是动态规划。当然我这使用的是由上至下的方法(n开始)。也可一使用由下至上的方法(1开始)。
暴力递归
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];
}
}
原文:https://www.cnblogs.com/jiezao/p/13369911.html