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;
}
};