好题集 (1) - LG P3978 [TJOI2015] 概率论
题意:给定二叉树结点数 \(n\),求这棵二叉树的期望叶子数。
设 \(f_n\) 表示有 \(n\) 个结点的二叉树的总数,\(g_n\) 表示在有 \(n\) 个结点的 \(f_n\) 棵二叉树中叶子的总数。那么答案就应为\(\frac{g_n}{f_n}\)。考虑怎么求。打表:
)
我们发现 \(g_n=n\cdot f_{n-1}\)。
证明一下这个结论。假设现在有一棵 \(n\) 个结点构成的二叉树,树上有 \(k\) 个叶子。若把这 \(k\) 个叶子扔掉,就可以得到 \(k\) 棵不同的、由 \(n-1\) 个结点构成的二叉树。而每棵有 \(n-1\) 个结点的二叉树都可以找出 \(n\) 个空位来放置新的叶子(可以画图理解),换言之,每棵 \(n-1\) 个结点构成的二叉树都会被得到 \(n\) 次。于是就有 \(g_n=n\cdot f_{n-1}\)。
又由一些卡特兰数相关的前置知识(当然由上面打的表也可以猜出来),\(f_n=C_n=\frac{C_{2n}^n}{n+1}\)。回代化简,大力推柿子:
\[\begin{align*}
\frac{g_n}{f_n}&=\frac{n\cdot f_{n-1}}{f_n}\\
&=n\cdot f_{n-1}\cdot (f_n)^{-1}\\
&=n\cdot\frac{C_{2(n-1)}^{n-1}}{n}\cdot\frac{n+1}{C_{2n}^n}\\
&=\frac{C_{2n-2}^{n-1}\cdot(n+1)}{C_{2n}^n}\\
&=C_{2n-2}^{n-1}\cdot(n+1)\cdot(C_{2n}^n)^{-1}\\
&=\frac{(2n-2)!}{(n-1)!(n-1)!}\cdot\frac{(n+1)n!}{(2n)!}\\
&=\frac{1}{(n-1)!(n-1)!}\cdot\frac{(n+1)!n!}{2n(2n-1)}\\
&=\frac{1}{(n-1)!}\cdot\frac{(n+1)!n}{2n(2n-1)}\\
&=\frac{1}{(n-1)!}\cdot\frac{(n+1)!}{2(2n-1)}\\
&=\frac{n(n+1)}{2(2n-1)}
\end{align*}
\]
答案即为 \(\frac{n(n+1)}{2(2n-1)}\)。
(补证一个问题:为什么二叉树同构数恰好是卡特兰数?)
考虑一棵二叉树的前、中序遍历序列。不难发现前者就是入栈序列,后者就是出栈序列。
若入栈序列固定,那按照卡特兰数的定义,出栈序列数就是卡特兰数。
又因为前、中序遍历合在一起即可确定一棵二叉树,所以二叉树同构数就是卡特兰数。
代码:
#include<iostream>
using namespace std;
double n;
signed main(){
scanf("%lf",&n);
printf("%.9lf",n*(n+1)/2/(2*n-1));
return 0;
}
提交记录。

浙公网安备 33010602011771号