题意
考虑这样的二叉树:
- 每个内部节点同时有左儿子和右儿子
- 恰好有 n 个叶子
对任意满足上述条件的二叉树,我们按照中序遍历把每个叶子分别标上
求所有这样的二叉树经过任意交换后可以得到的不同的排列的个数。
约定:
初步分析
考虑任意一个符合条件的二叉树,我们把它的每个内部节点染上黑白两色之一,然后交换所有黑色节点的左右子树,就可以得到一个符合条件的排列。
这样不会重复计数?
废话这样当然会重复计数。。。
考虑如果存在两个相邻的节点被染上同一种颜色(自行脑补吧……)那么你可以像旋转平衡树一样把它们转一下,得到一个形态不同的二叉树,对这个新的二叉树按照染色进行变换,可以得到一个和原树变换后相同的排列。
但是这些方案你总不能不计吧?
考虑最小表示法的思想,我们规定每个点不能和它的左儿子(如果有的话)染上同样的颜色,否则的话可以把树“右旋”一下使得两个颜色相同的点变成父亲-右儿子的形式。这样就可以不重不漏的计数了。
证明了吗?
关于这个做法我脑补了一个长而且麻烦的证法…太啰嗦了这里写不下(害怕是错的被hack)。不过事实证明这样的方法是 work 的。
那么初步分析就完成了,我们有已经大概的思路辣!
推导
考虑二叉树的 n−1 个内部节点,显然只有那些左孩子为叶子的点可以自由染色,其他点的颜色已经被限制了(要求和左孩子颜色相反),设有 m 个点的左孩子为叶子,那么对这个树染色有
考虑把所有叶子节点剥去,那么可以自由染色的点就是所有没有左孩子的点,我们设 hn 表示有 n 个节点的各种形态的二叉树的不同染色方案的和。
hn
的递推关系与生成函数:
首先边界条件为 h0=1 。
枚举根节点的左右子树大小,可以得到这样的关系式(注意没有左孩子时候根节点可以自由染色):