This is only a DP problem to count the number of all the possible combination(here is the unique binary tree). We can easily find that when n = 0 or 1, the count is 1. n =2, count = 2; n = 3, count = 5. The regular pattern is that num[n] += 2*num[i]*num[n-1-i] (except that i == n-1-i)for all the i from 0 to (n-1)/2. For i == n-1-i, the situation becomes that num[n] += num[i]*num[n-1-i]
Code(Recursion & iterative way):
public class Solution { /* public int numTrees(int n) { int[] num = new int[n+1]; num[0] = 1; return numSubtree(n, num); } public int numSubtree(int n, int[] num){ int sum = 0; if(n == 0) return num[0] = 1; for(int i = 0; i <= (n-1)/2; i++){ if(i != n-1-i) sum += 2*(numSubtree(i, num)*numSubtree(n-1-i, num)); else sum += numSubtree(i, num)*numSubtree(n-1-i, num); } num[n] = sum; return num[n]; } */ public int numTrees(int n){ int[] num = new int[n+1]; if(n == 0) return 1; if(n == 1) return 1; if(n == 2) return 2; if(n == 3) return 5; num[0] = 1; num[1] = 1; num[2] = 2; num[3] = 5; for(int i = 4; i <= n; i++){ for(int j = 0; j <= (i-1)/2; j++){ if(j != i-1-j) num[i] += 2*(num[j]*num[i-1-j]); else num[i] += num[j]*num[i-1-j]; } } return num[n]; } }