一、问题描述
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
二、问题分析
一看到这个题,第一想到的就是n个节点的不同的二叉树有多少种,即采用Catalan公式,该公式的递推表达式为h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2),当n=0或1时,h(n)=1.当然查资料发现它还有其它的形式,比如h(n)=((4*n-2)/(n+1))*h(n-1);以及h(n)=C(2n,n)/(n+1) (n=1,2,3,...),我采用了第一种表达式的解法,比较简单的DP。
三、Java AC代码
public int numTrees(int n) {
int[] d = new int[n+1];
d[0] = 1;
d[1] = 1;
for (int i = 2; i <= n; i++) {
d[i] = catalan(i, d);
}
return d[n];
}
public int catalan(int n,int[] d){
int res = 0;
int tmp = 0;
while(tmp<n){
res+= d[tmp]*d[n-1-tmp];
tmp++;
}
return res;
}