题目:Unique Binary Search Trees

找值为1->n的所有可能的二叉树。

如果是找可能的数量而不需要列出所有可能时,可以用动态规划。

思路如下:

动态规划法:f(n)表示该子树中有n个数字可用来组成树枝
f(0) = 1;空树
f(1) = 1;树根
f(2) = f(0)*f(1) + f(1)*f(0);当左子树有0个数,右子树右1个数的情况和当左子树有1个数,右子树有0个数的情况;
f(3) = f(0)*f(2) + f(1)*f(1) + f(2)*f(0);

...
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0);

注意事项:

1.外循环从2开始,内循环不能超过外循环的循环变量;

2。每次开始内循环时,将累加的变量清零。

int numTrees2(int n){
    if (n < 2)return 1;
    vector<int> nums;
    nums.push_back(1);
    nums.push_back(1);
    for (int i = 2; i <= n; i++)
    {
        int num = 0;
        for (int j = 0; j < i; j++)
        {
            num += nums[j] * nums[i - j - 1];
        }
        nums.push_back(num);
    }
    return nums[n];
}

同类型的题目:http://www.cnblogs.com/yeqluofwupheng/p/6755645.html