LeetCode 每日一题 96. 不同的二叉搜索树

题目描述

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

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

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

Solution

设答案为 \(G(n)\) ,显然有 \(G(n) = \Sigma _{i=1} ^n G(i-1)*G(n-i)\) , \(G(0)=G(1)=1\) .

引入卡特兰数Catalan number,其定义式 \(Catalan_n=\Sigma_{1} ^{n-1} Catalan_i * Catalan_{n-i}\)

令生成函数 \(g(x) = h_1 x + h_2 x^2 + h_3 x^3 + ... + h_n x^n\) (h_i 即 Catalan_i)

\[[g(x)]^2 = h_1^2x^2 + (h_1 h_2 + h_2 h_1)x^3 + (h_1 h_3 + h_2 h_2 + h_3 h1) x^4 + ... + (h_1 h_{n-1} + h_2 h_{n-2} + ... +h_{n-1} h_1)x^n + ... \]

代入 \(h_1 = h_2 = 1\) ,(卡特兰数定义式有 \(h_n = \Sigma_{1}^{n-1}h_i * h_{n-i}\)

\[\begin{align*} [g(x)]^2 &= h_2^2x^2 +h_3 x^3 + h_4 x^4 + ... + h_n x^n + ... \\ &= g(x) - h_1 x \\ &= g(x) - x \\ \end{align*} \]

于是有 \([g(x)]^2 - g(x) + x = 0\) , \(g_1(x) = \frac{1 \pm \sqrt{1-4x}}{2}\)

\(g(0) = 0\), 所以 \(g(x) = \frac{1 - \sqrt{1-4x}}{2} = \frac{1}{2}- \frac{1}{2} (1-4x)^{\frac{1}{2}}\)

牛顿二项式展开 \(g(x)\)

\[(1+z)^\frac12 = 1 + \Sigma_{n=1} ^\infty \frac{(-1)^{n-1}}{n \times 2^{2n-1}} \begin{pmatrix} 2n-2 \\ n-1 \end{pmatrix} \qquad \]

得通项

\[h_n = \frac1n \begin{pmatrix} 2n-2 \\ n-1 \end{pmatrix} \qquad \]

参考链接:

class Solution {
 public:
  int numTrees(int n) {
    // wiki:C(2n,n)/n+1 = 2n! / ( n! (n+1)! )
    // how to get this ? C_{i+1} = 2*(2*i+1)/(i+2) C_{i}
    unsigned long long ans = 1;
    for(int i = 0; i < n; ++i)
      ans = 2 * (2 * i + 1) * ans / (i + 2);
    return ans;
  }
};
posted @ 2020-07-15 10:12  菁芜  阅读(95)  评论(0编辑  收藏  举报