给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
思路:假设当前枚举的搜索树的树根为i,则它的左子树一定是1~i-1构成的子树,右子树一定是i+1~n构成的子树,可以发现一个问题已经分成了两个子问题了,我们设dp[i]为以i为根构成的二叉搜索树的个数,我们可以得到:
dp[i]=dp[i-1]*dp[n-i];
于是这道题就解决啦啦。
class Solution {
public int numTrees(int n) {
int[] dp=new int[n+1];
dp[0]=dp[1]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i]+=dp[j-1]*dp[i-j];
return dp[n];
}
}
方法二:数学演绎法

class Solution {
public int numTrees(int n) {
long C = 1;
for (int i = 0; i < n; ++i) {
C = C * 2 * (2 * i + 1) / (i + 2);
}
return (int) C;
}
}
本文探讨了如何计算由1到n整数构成的不同二叉搜索树的数量,提供了两种解决方案:一种是通过动态规划实现,另一种是利用数学演绎法简化计算过程。
&spm=1001.2101.3001.5002&articleId=99172423&d=1&t=3&u=63f085df04ab4ec883b37ddc60f3460b)
1252

被折叠的 条评论
为什么被折叠?



