不管一个BST的形状是怎样的,以一个数字作为根,左子树的情况数量由于数字数量固定,这个结果可以重复利用,右子树同理。从1开始枚举每个数字作为根,那么以dp[i]
表示前i
个数字可以组成的情况数量
[dp[i] = sum^{n-1}_{k=0} dp[k]*dp[i-k-1]
]
等于左子树情况的数量乘以右子树情况的数量,即左右子树的组合总数。
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1, 0);
dp[0] = dp[1] = 1;
for (int i = 2; i <= n; ++i) {
for (int k = 0; k < i; ++k) {
dp[i] += dp[k]*dp[i-k-1];
}
}
return dp[n];
}
};