96. 不同的二叉搜索树(leetcode)
题目描述
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例1
输入:n = 3
输出:5
示例2
输入:n = 1
输出:1
提示信息
1 <= n <= 19
题解1(C++版本)
class Solution {
public:
int dp[25]; // dp[i]表示以i为根节点的二叉搜索树的种树
int dfs(int n){
if(n == 0 || n == 1) return 1;
if(dp[n]) return dp[n]; // 记忆化搜索,避免重复搜索
int sum = 0;
for(int i = 0; i < n; i++){ // dp[n] = dp[0]*dp[n - 1] + dp[1]*dp[n - 2] + ... + dp[n - 1]*dp[0]
sum += dfs(i) * dfs(n - 1 - i);
}
return dp[n] = sum;
}
int numTrees(int n) {
memset(dp, 0, sizeof dp);
return dfs(n);
}
};