题目:
给你一个整数 n,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树
有多少种?返回满足题意的二叉搜索树的种数。
解题思路:
- 给出 n,要求利用 1-n 这些数字组成二叉排序树,有多少种不同的树的形态,输出这个个数。
- 这题的解题思路是 DP。dp[n] 代表 1-n 个数能组成多少个不同的二叉排序树,F(i,n) 代表以 i 为根节点,1-n 个数组成的二叉排序树的不同的个数。由于题意,我们可以得到这个等式:dp[n] = F(1,n) + F(2,n) + F(3,n) +……
- F(n,n) 。初始值 dp[0] = 1,dp[1] = 1。分析 dp 和 F(i,n) 的关系又可以得到下面这个等式F(i,n) = dp[i-1] * dp[n-i] 。举例,[1,2,3,4,…, i ,…,n-1,n],以 i 为根节点,那么左半边 [1,2,3,……,i-1] 和 右半边 [i+1,i+2,……,n-1,n]分别能组成二叉排序树的不同个数相乘,即为以 i
为根节点,1-n 个数组成的二叉排序树的不同的个数,也即 F(i,n)。
参考:
霜神96.二叉树个数
Java代码
class Solution {
public int numTrees(int n) {
int[] res = new int[n+1];
res[0] = 1;
res[1] = 1;
for(int i = 2;i<=n;i++){
for(int j = 1;j<=i;j++)
res[i] += res[j-1]*res[i-j];
}
return res[n];
}
}
复杂度分析:
时间复杂度是O(n2),空间复杂度O(n)。
时间:1+2+3+…+n