96. 不同的二叉搜索树
题目:给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
解法:动态规划
思路:数学符号:dp[i]表示以 1 ... i 为节点组成的二叉搜索树有多少 状态转移方程:假设 n 个节点存在二叉排序树的个数是 dp (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则
dp (n) = f(1) + f(2) + ... + f(n); 而以 i 为根的二叉搜索树的左子树有1,2,3,,i-1等节点,即为dp(i-1) ,右子树有i+1,i+2..n,即为dp(n-i)(技巧:可把i+1,i+2..n看作是1,2,3,,,n-i),所以dp(n)= dp[i-1] * dp[n-i] (i从1到n)
代码:
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1]; //dp[i]表示以 1 ... i 为节点组成的二叉搜索树有多少
dp[0] = 1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i] += dp[j-1]*dp[i-j];
}
}
return dp[n];
}
}

浙公网安备 33010602011771号