96. Unique Binary Search Trees
Description
Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?
Example:
Input: 3
Output: 5
Explanation:
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
Analysis
依次计算以每个结点作为根节点的树的数量。由于二叉搜索树的特征为左子树所有节点都比根节点小,右子树所有节点都比根节点大,其子树也遵循此规则。因此如果确定了根节点为i,可知其左子树的根节点可有(i-1)种情况(有i-1个节点值小于i),其右子树的根节点可有(n-i)种情况(有n-i个节点值大于i),进而将左右子树的数量进行笛卡尔乘积,也就是说,如果左子树有m种情况,右子树有n种情况,则其排列组合共有m*n种情况。
而长度为n的树,其根节点有n种情况(0,1,…,n-1),设其为G(n)。设长度为n,且根节点为i的树,有F(i,n)种情况。因此,G(n)=F(0,n)+F(1,n)+F(2,n)+…+F(n-1,n) ①。
由第一段所说,可知根节点为i的树,其unique BST的数目为其左子树(长度为i-1)数目与右子树(长度n-i)数目的乘积。即*F(i,n)=G(i-1)G(n-i) ②。
另外,当节点总数为0时,为空树,此时G(0)=1;当节点总数为1时,只有一个节点,此时G(1)=1。
再结合式①和式②,可得:G(n) = G(0) * G(n-1) + G(1) * G(n-2) + … + G(n-1) * G(0) ③。
由式③可知,G(n)的计算是根据G(0), G(1), …, G(n-1)得到的。因此我们要从n小到n大计算G(n)。
Code
class Solution {
public:
int numTrees(int n) {
int G[n+1] = {0};
G[0] = G[1] = 1;
for(int i=2; i<=n; i++){
for(int j=1; j<=i; j++){
G[i] += G[j-1]*G[i-j];
}
}
return G[n];
}
};