问题:ip
Given n, how many structurally unique BST's (binary search trees) that store values 1...n?get
For example,
Given n = 3, there are a total of 5 unique BST's.io
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
解决:class
① 二叉搜索树有个性质,就是左边的数都比根小,右边的数都比根大。另外,题目说明二叉树的节点是从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。im
n = 2时,因为1和2均可觉得根,分别算出来,再把它们加起来便可。n = 2的状况可由下面式子算出: img
dp[2] = dp[0] * dp[1] (1为根的状况)di
+ 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]; } }