问题描述
解题报告
共有
n
n
n 个节点,每个节点都可当做根节点。
当以节点
i
i
i 作为根节点时,为符合二叉搜索树的性质,左节点个数是
i
i
i,即
0
、
1
⋯
、
i
0、1\cdots、i
0、1⋯、i ;右节点个数为
n
−
i
n-i
n−i,即
i
、
i
+
1
⋯
、
n
i、i+1\cdots、n
i、i+1⋯、n
C 0 = 1 C n + 1 = ∑ i = 0 n C i C n − i f o r n ≥ 0 C_{0}=1\\ C_{n+1}=\sum_{i=0}^{n}C_{i}C_{n-i} \; for \;n\ge0 C0=1Cn+1=i=0∑nCiCn−iforn≥0
实现代码
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
for (int j = 0; j < i; ++j) {
dp[i] += dp[j] * dp[i - j - 1];
}
}
return dp[n];
}
};