设 fi,j 表示有 i 个叶子,树高为 j,这样的树出现的概率:
Ans=i=1∑n−1fn,i×i
枚举根节点的左子树内部的情况。设 pi,j 表示一共有 i 个叶子,其中 j 个在根的左子树的概率。因为根节点的深度为 0,所以下图绿色部分的深度,等于两个红色部分深度的较大值加 1。
因此我们枚举左子树的子树,当这两边有一边的深度为 j−1 时,总的深度就是 j。所以有:
fi,j=k=1∑i−1pi,k×x=1∑jy=1∑jfk,x×fi−k,y[x=j−1∨y=j−1]
因为后面两个 sigma 的条件是 x,y 有一个满足是 j−1,所以没必要套起来。时间复杂度 n4。
设 pi,j 表示一共有 i 个叶子,其中 j 个在根的左子树的概率,fi,j 表示有 i 个叶子,且深度大于等于 j 的概率。
考虑根的左儿子的两个子树的情况,只要有一边的深度大于等于 j−1,整个树的深度就大于等于 j−1。分别考虑左右子树是否有一边深度大于等于 j−1。注意两边都有可能大于等于 j−1,因此需要去除重复算的部分:
fi,j=k=1∑i−1pi,k×(fk,j−1+fi−k,j−1−fk,j−1×fi−k,j−1)
若 p 能预处理或 O(1) 算,时间复杂度就是 n3。考虑怎么算 p。
第一个 sigma 中枚举 k 表示左子树的叶子个数。考虑左子树里有恰好 k 个叶子的树如何生成。第一步是根挂叶子,然后左子树与右子树以某种顺序挂叶子,只要左子树挂了 k−1 次就够了。
顺序不影响叶子的个数,只要是 k−1 次左边和 i−k−1 从右边组成的挂节点顺序就可以了。因此一个组合数 (k−1i−2)。
考虑左子树生成的方案数。k 个叶子有 (k−1)! 种方法。证明:设 k 个叶子有 ak 种方法,而 k 个叶子相当于 k−1 个叶子的情况任选叶子挂新节点,有 ak=ak−1×(k−1)。
同理,右子树叶子数为 i−k,生成的方案数为 (i−k−1)!。两种方法相乘,总共有 (k−1)!(i−k−1)! 种方案。乘上前面求出的左右子树生成顺序的方案数 (k−1)!(i−k−1)!(i−2)!。我们发现生成一个左子树有 k 个叶子,右子树有 i−k 个叶子的树的方案数为 (i−2)!,与 k 没有什么关系了。
回到 p 的定义,pi,j 表示一共有 i 个叶子,其中 j 个在根的左子树的概率。前面推出 pi,j 与 j 无关。而左子树至少有一个叶子。因此左子树的叶子数有:1,2,3,⋯,i−1 几种可能。因为是等概率的,所以有 pi,j=i−11:
fi,j=k=1∑i−1i−1fk,j−1+fi−k,j−1−fk,j−1×fi−k,j−1
初值 fi,0=1。不难发现这样的递推是 n3 的。考虑求答案。
n 个叶子的树,深度不超过 n−1。因此设 gi,j 表示有 i 个叶子,深度等于 j 的概率:
Ans=i=1∑n−1gn,i×i
而且可以知道:
fi,j=k=j∑n−1gi,k
因此对所有的 fn,j 求和:
i=1∑n−1fn,i=i=1∑n−1j=i∑n−1gn,j=i=1∑n−1gn,i×i=Ans
得出答案为 ∑i=1n−1fn,i。