163. 不同的二叉查找树

163. 不同的二叉查找树 

 

给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?

样例

给出n = 3,有5种不同形态的二叉查找树:

1           3    3       2      1
 \         /    /       / \      \
  3      2     1       1   3      2
 /      /       \                  \
2     1          2                  3

int NumTrees::numTrees(int n) {
    /*
     * 解题思路:二叉树递归的原则思路
     * 1.3个可以看做是左子树2个 右子树2个 和左右子树分别一个相乘 2*0+1*1+0*2
     * 2.4个可以看做做树 固定1个  左3 右1 左2 右2  左1 右3 3*0+1*2+2*1+0*3
     * */
    // write your code here
    if (n <= 0) {
        return 1;
    }
    vector<int> dp(n + 1, 0);

    dp[0] = dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            dp[i] += dp[j - 1] * dp[i - j];
        }
    }
    return dp[n];
}

  

 
posted @ 2017-12-06 13:06  Quintinz  阅读(208)  评论(0编辑  收藏  举报