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];
    }
}

 

posted on 2016-01-27 12:57  爱推理的骑士  阅读(125)  评论(0编辑  收藏  举报