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 每一个数都可以作为根节点,当i作为根节点的时候,从1-(i-1)可以作为左子树,从i+1到n可以作为右子树,那么左子树的棵数乘以右子树的棵树就是当前i结点都作为根节点的所有可能的BST树的棵树。
用h[i]来表示共有i个结点时,能构成的BST树的数目。
- 当n=0为空树只有一种情况,所以h[0]=1;
- 当n=1,只有一个结点,所以h[1]=1
h(n)=h(0)*h(n-1)+h(1)*h(n-2)+h(2)*h(n-3)+…+h(n-1)*h(0)
实际上就是卡特兰公式,这个公式与从1-n每一个数都可以作为根节点是一一对应的,比如n=4;
- 当i=1时,确定左边0个结点,右边有n-1个结点
- 当i=3时,可以确定左边2个结点,右边有1个结点
public class Solution {
public int numTrees(int n) {
if(n<0) return 0;
int[] h=new int[n+1];
h[0]=1;
h[1]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<i;j++)
h[i]+=h[j]*h[i-1-j];
}
return h[n];
}
}
递归如下(但是超时了):
public int numTrees(int n) {
int result = 0;
if (n <= 0)
return 0;
result = constructTree(1, n);
return result;
}
int constructTree(int start, int end) {
if (end - start <= 0)
return 1;
if (end - start == 1)
return 2;
int result = 0;
for (int i = start; i <= end; i++) {
result = result + constructTree(start, i - 1)
* constructTree(i + 1, end);
}
return result;