问题:
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?
For example,
Given n = 3, there are a total of 5 unique BST's.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解决:
① 二叉搜索树有个性质,就是左边的数都比根小,右边的数都比根大。另外,题目说明二叉树的节点是从1到n,所以我们能确定如果根为k,则根左边的数是1到k-1,根右边的数是k+1到n。时间 O(N!) 空间 O(N)
这道题实际上是 Catalan Number卡塔兰数的一个例子,当 n = 1时,只能形成唯一的一棵二叉搜索树,n分别为1,2,3的情况如下所示:
n = 0 时赋为1,因为空树也算一种二叉搜索树;
n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。
n = 2时,由于1和2都可以为根,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:
dp[2] = dp[0] * dp[1] (1为根的情况)
+ dp[1] * dp[0] (2为根的情况)
同理可写出 n = 3 的计算方法:
dp[3] = dp[0] * dp[2] (1为根的情况)
+ dp[1] * dp[1] (2为根的情况)
+ dp[2] * dp[0] (3为根的情况)
由此可以得出卡塔兰数列的递推式为:
所以,可以得到如下代码:
class Solution { //0ms
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2;i <= n;i ++ ) {//计算节点数2到n的BST
for (int j = 0;j < i ;j ++ ) {
dp[i] += dp[j] * dp[i - j - 1];
}
}
return dp[n];
}
}