Catalan numbers.
/**
* # of binary trees = (# of trees on LHS) * (# of choices as root) * (# of trees on RHS)
* let c[n] be the total # of binary trees
* c[0] = c[1] = 1
* choose 1 as root, no element on the left sub-tree. n-1 elements on the right sub-tree.
* Choose 2 as root, 1 element on the left sub-tree. n-2 elements on the right sub-tree.
* Choose 3 as root, 2 element on the left sub-tree. n-3 elements on the right sub-tree.
* Choose i as root, i-1 elements on the left sub-tree. n-i elements on the right sub-tree.
* therefore c[n] = c[0]*c[n-1] + c[1]*c[n-2] + ... + c[i-1]*c[n-i] + ... + c[n-1]*c[0]
* = Ec[i-1]c[n-i] 1<=i<=n
*/
public class Solution {
public int numTrees(int n) {
int[] c = new int[n+1];
c[0] = c[1] = 1;
for (int i=2; i<n+1; i++) {
for (int j=1; j<=i; j++)
c[i] += c[j-1]*c[i-j];
}
return c[n];
}
}