题目描述
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
思路分析
先观察,我们可以发现序列1-n,选i做根,则1-i为左子树,i-n为右子树,则i根的不同bst个数就是左右子树不同情况的乘积。
eg. 1234,选2做根,左子树1,右子树34,相当于F(2,4)=O(1)*O(2)
将这个发现拓展到全体,可以发现O(n)=∑
O(i-1)*O(n-i)。
递归求解复杂度高,用动规。动规能把大问题分解成小规模问题,并能存储并重用子问题的解!
注:看解析才发现,这也是卡特兰数。
代码实现
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 = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}