[LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树

思路

  • 标签:动态规划
  • 假设n个节点存在二叉排序树的个数是G(n),令f(i)为以i为根的二叉搜索树的个数,则   G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n)
  • 当i为根节点时,其左子树节点个数为i-1个,右子树节点为n-i,则   f(i)=G(i1)G(ni)
  • 综合两个公式可以得到 卡特兰数 公式:    G(n)=G(0)G(n1)+G(1)(n2)+...+G(n1)G(0)   正好可以作为dp的状态转移方程。

代码:

class Solution {
public:
    int numTrees(int n)
    {
        std::vector<int> dp(n+1,0);
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2;i<=n;++i)
            for(int j = 0;jj)
            {
                dp[i] += dp[j]*dp[i-1-j];
            }
        return dp[n];
    }
};

 

你可能感兴趣的:([LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树)