题目大意:将数字1~n构建成二叉搜索树,问有多少种构建方法
分析:动规。
状态:dp[i]——由i个数字构建成二叉搜索树的方式个数
初始化:dp[0]=1(空树,为一种方式)
结果:dp[n]
状态转移方程:dp[i]=sum{dp[k-1]*dp[i-k]} 1<=k<=i
解释:以数字1~n分别做根来构建二叉树,我们发现如下规律——以i为根构建的方式个数等于根的左子树个数乘以右子树个数,由二叉搜索树的构建规律我们知道i的左子树是由1~i-1构成的,右子树是由i+1~n构成的。举例来说,当n=3时:
dp[3]=dp[0]*dp[2] 1为根时
+dp[1]*dp[1] 2为根时
+dp[2]*dp[0] 3为根时
观察规律即可得出dp状态转移方程。
代码:
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1,0);
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];
}
};