让我们通过列表来表示树。
如果叶子节点的数量是两个,分别是A和B。那么只有一棵树(A B)。
如果叶子节点的数量是三个,分别是A、B和C。那么就有两棵树:((A B) C) 和 (A (B C))。
那么如果有N个叶子节点,会有多少棵树呢?
让我们通过列表来表示树。
如果叶子节点的数量是两个,分别是A和B。那么只有一棵树(A B)。
如果叶子节点的数量是三个,分别是A、B和C。那么就有两棵树:((A B) C) 和 (A (B C))。
那么如果有N个叶子节点,会有多少棵树呢?
让具有 N
个叶子节点的二叉树数量为 T(N)
。
我们可以立即看到 T(1) = T(2) = 1
,对于 N > 2
,我们可以在根部分裂,得到两个叶子更少的子树。或者等价地,我们可以从具有 k
和 N-k
个叶子节点的两个非空二叉树组装一个具有 N
个叶子节点的二叉树。两个子树都非空的条件转化为 1 <= k <= N-1
。因此我们有递归式:
N-1
T(N) = ∑ T(k) * T(N-k)
k=1
1,1,2,5,14,42,132,429,1430,4862,16796
并且搜索它们。人们会发现这些是卡塔兰数,
C(n) = (2*n)! / (n! * (n+1)!)
偏移量加一,因此
T(N) = C(N-1)
这可以比递归计算快得多。
N > 0
,你将拥有 ℵ_0 棵树。 - Daniel Fischer