题目:96. 不同的二叉搜索树
思路
动态规划
f[i]
:有i
个结点有多少种二叉搜索树
状态转移方程:
以n=3
为例:
以1
为头节点,左子树有0
个结点,右子树有2
个结点;
以2
为头节点,左子树有1
个结点,右子树有1
个结点;
以3
为头节点,左子树有2
个结点,右子树有0
个结点;
代码
我写的
可能逻辑不通顺,毕竟是直接上手调试的;
// f[i] : 由i个结点组成的blabla有多少种
// f[i] = f[]
class Solution {
public:
int numTrees(int n) {
int f[25] = {0};
int i, j;
f[0] = 1;
f[1] = 1;
// f[2] = 2;
// f[3] = 5;
for(i = 2; i <= n; i++)
{
for(j = 0; j < i; j++)
{
f[i] += f[j] * f[i-j-1];
}
// 左子树有 i-1 个,右子树有 j-i 个;
}
return f[n];
}
};
代码随想录
class Solution {
public:
int numTrees(int n) {
int i, j;
int f[25] = {0};
f[0] = 1;
for(i = 1; i <= n; i++)
{
// 谁做头节点
for(j = 1; j <= i; j++)
{
// 左子树有 j-1 个结点, 右子树有 i-j 个结点
f[i] += f[j-1] * f[i-j];
}
}
return f[n];
}
};