法一(动态规划)
/**
* 动态规划
* 1. 思路
* 假设n个节点存在BST的个数是G(n)
* 当1为根节点时,其左子树节点个数为0,右子树节点个数为n-1
* 当2为根节点时,其左子树节点个数为1,右子树节点个数为n-2
* ...
* 可得G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)
* 2. 步骤
* (1)确定dp数组以及下标的含义
* dp[i]表示以1到i为节点组成的BST的个数
* (2)确定递推公式
* dp[i] += dp[j - 1] * dp[i - j];
* 一共i个节点,对于根节点j,左子树的节点个数为j-1,右子树的节点个数为i-j
* (3)确定dp数组如何初始化
* dp[0] = 1
* (4)确定遍历顺序
* 首先遍历每一个节点i,然后在[1, i]里遍历节点j,将j视作BST根节点
* 3. 复杂度
* 时间复杂度 O(n^2)
* 空间复杂度 O(n)
*
* @param n
* @return
*/
public int numTrees(int n) {
int dp[] = new int[n + 1];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
本地测试
/**
* 96. 不同的二叉搜索树
*/
lay.showTitle(96);
Solution96 sol96 = new Solution96();
System.out.println(sol96.numTrees(3));