leetcode96 不同的二叉搜索树

题目https://leetcode-cn.com/problems/unique-binary-search-trees/submissions/

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

思路: 动态规划,设状态dp(i)表示从1-i的序列可以组成的二叉搜索树有多少种,从1-i中任选一结点j作为根节点,那么1-j-1组成其左子树,j+1-n组成其右子树,那么以j为根节点的BST方案数就是左子树和右子树方案的乘积。事实上从j+1...n的序列BST方案数等于1...n-j,即dp(n-j)。所以状态转移方程是 \(dp(i) = \sum_j dp(j-1) * dp(i-j)\)

代码

class Solution {
public:
    int numTrees(int n){
        vector<int> dp; dp.resize(n+1);
        dp[0] = 1; 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 @ 2020-02-12 18:53  patrolli  阅读(113)  评论(0编辑  收藏  举报