题目链接
题目描述
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入: n = 3
输出: 5
示例 2:
输入: n = 1
输出: 1
提示:
- 空树有一种
- 一个节点有一种
- 对于 n 个节点,根节点占一个,左子树的节点个数可以为0,1,2,3,4,….,n-1,对应的右子树的节点个数可以是n-1-0,n-1-1,n-1-2,….,0。当左节点有 i 个时,左子树二叉搜索树有 dp[i] 种,当右子树有 j 个时,右子树二叉搜索树有 dp[j] 种,其中 i+j+1 = n,当前左右分布 二叉搜索树有 dp[i] * dp[j] 种。递推公式为:
G(n)=∑G(i−1)⋅G(n−i) i=[0,n)
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i <= n; ++i){
for(int j = 0; j< i;++j){
// dp[j]为左边节点个数, dp[i - j - 1]为右边节点个数
// j + (i - j - 1) + 1(根节点) == N
dp[i] += (dp[j] * dp[i - j - 1]);
}
}
return dp[n];
}
}