有趣的问题!我相信答案是N阶乘!
给定一个树结构,只有一种方法来填充二叉搜索树键值。
因此我们需要做的就是计算不同的堆数量。
给定一个堆,考虑对树进行中序遍历。
这对应于数字 1 到 N 的排列。
现在给定 {1,2...,N} 的任意排列,您可以按如下方式构造堆:
找到最大元素的位置。其左侧的元素形成左子树,右侧的元素形成右子树。这些子树是通过查找最大元素并在那里分裂来递归形成的。
这产生了一个堆,因为我们总是选择最大元素,并且该堆的中序遍历就是我们开始的排列。因此,我们有一种从堆到排列并唯一地返回的方法。
因此所需的数量是N!。
举个例子:
5
/ \
3 4 In-order traversal -> 35142
/ \
1 2
现在从 35142 开始。最大的是 5,所以 3 是左子树,142 是右子树。
5
/ \
3 {142}
在142中,4最大,1在左边,2在右边,所以我们得到
5
/ \
3 4
/ \
1 2
为此填写二分搜索键的唯一方法是:
(2,5)
/ \
(1,3) (4,4)
/ \
(3,1) (5,2)
更正式的证明:
If HN is the number of heaps on 1...N, then we have that
HN = Sum_{L=0 to N-1} HL * HN-1-L * (N-1 choose L)
(基本上我们选择最大值并分配给根。选择左子树的大小,然后选择那么多元素并在左右递归)。
Now,
H0 = 1
H1 = 1
H2 = 2
H3 = 6
If Hn = n! for 0 ≤ n ≤ k
Then HK+1 = Sum_{L=0 to K} L! * (K-L)! * (K!/L!*(K-L)!) = (K+1)!