一、题目描述
给你一个整数示例1:n
,求恰由n
个节点组成且节点值从1
到n
互不相同的 二叉搜索树有多少种?返回满足题意的二叉搜索树的种数。
输入:示例2:n = 3
输出:5
输入:n = 1
输出:1
提示:
1 <= n <= 19
二、问题分析
- 确定dp数组及下标的含义: d p [ i ] dp[i] dp[i]的定义: i i i个不同元素节点组成的二叉搜索树的个数
- 确定递推公式:可以将一颗树以
j
j
j为头结点,那么左子树节点数为
j - 1
,右子树节点数为i - j
, j j j从 1 1 1遍历到 i i i,所以递推公式:dp[i] += dp[j-1] × dp[[i-j]
- 初始化dp数组:从递推公式可以看出初始化
dp[0]
即可,空节点也是一颗二叉树,所以dp[0] = 1
三、代码实现
// 编程软件:VS2019
// 参考书籍:代码随想录
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
// 动态规划:时间复杂度O(n的平方)空间复杂度O(n)
int numTrees(int n) {
vector<int> dp(n + 1);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i ; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
int main() {
cout << numTrees(3);
}
// 结果:5