题目描述
给定一个整数 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}))
[egin{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 imes 2^{2n-1}}
egin{pmatrix}
2n-2 \
n-1
end{pmatrix} qquad
]
得通项
[h_n = frac1n
egin{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;
}
};