题目: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];}
};