输入: 3
输出: 5
解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
要满足是二叉搜索树,以i为root, 左子树的个数为i-1(比i小的数),右子树的个数为n-i(比i大的数)。
此时如果出现个数为0,表示空树,记作1;只有一个节点,表示只有根的树,也记作1.
f(i)=f(i-1)*f(n-i) (一一组合配对构成整个二叉搜索树)
所以1-n为节点构成的二叉搜索树的个数为:
参看代码:
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1, 0);
//初始化: 0个节点 和 1个节点
dp[0] = 1, dp[1] = 1;//空树也是树
//转换方程: 以i作为root
for(int i = 2; i <= n; ++ i){
for(int j = 1; j <= i; ++ j){
//左子树个数 * 右子树个数
dp[i] +=