给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5
方法一:动态规划
我们定义动态规划数组 dp[n+1] 的含义为 由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 的种类。
则我们可以据此进行初始化 dp[0] = 1 (空树) dp[1] = 1 (仅含根节点)
分析可得 其中 是指以 i 为根节点的可能的二叉树种类。故可得 (n-i = n-(i-1)-1) 即可将 看作由 个小于 i 的节点作为左子树的可能 与 大于i的个右节点组合成右子树的可能 之积。综上可得
public int numTrees(int n) {
// dp[i] 表示从1->i个节点组成的二叉树的种数
int[] dp = new int[n+1];
dp[0] = 1; // 空树
dp[1] = 1; // 仅根节点
// i 表示以i为根的二叉树的种数
for (int i = 2; i <= n; ++ i)
for (int j = 1; j <= i; ++j)
dp[i] += dp[j - 1] * dp[i - j];
return dp[n];
}


![LeetCode-100题(Hot) 96. 不同的二叉搜索树 [Java实现] [极速] LeetCode-100题(Hot) 96. 不同的二叉搜索树 [Java实现] [极速]](http://www.mshxw.com/aiimages/31/273941.png)
