题目描述
题目链接:96. 不同的二叉搜索树
解题思路
动态规划。看的官方题解。
如果是直接想动态转移方程的话不太容易,但是像题解里面推出式子来就比较好理解了。
- 定义两个函数:
G(n): 长度为 n 的序列能构成的不同二叉搜索树的个数。
F(i, n): 以 i 为根、序列长度为 n 的不同二叉搜索树个数(1≤i≤n)。
代码
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1,0);
dp[0]=1;dp[1]=1;//dp[0]=1
for(int i=2;i<n+1;i++)
for(int j=1;j<=i;j++)//<=,即i=j时,dp[0]=1,即右子树为空时
dp[i]+=dp[j-1]*dp[i-j];
return dp[n];
}
};