从集合{1,2,3,4,5,6,7}中的每个密钥排列生成(通过连续插入节点)BST。有多少个排列确定了高度为2的树木?
我一直坚持这个简单的问题。任何暗示任何人。
顺便说一下答案是80。
答案 0 :(得分:5)
考虑树的高度2是多少?
- 需要以4为根,2为左子,6为右子等。
4根是怎么来的?
- 需要先插入。所以我们现在有一个数字,6个仍然可以在排列中移动。
和
- 第一次插入后,仍有6个位置,左边3个,右子树3个。那个6选择3 = 20个选择。
现在是什么?
- 对于左右子树,需要首先插入它们的根,然后子节点的顺序不影响树 - 2,1,3和2,3,1给出相同的树。每个子树的2个,左右子树的2 * 2 = 4个。
因此?
总之:C(6,3)* 2 * 2 = 20 * 2 * 2 = 80.
答案 1 :(得分:2)
请注意,此树只有一个可能的形状 - 它必须完美平衡。因此必须是这棵树:
4
/ \
2 6
/ \ / \
1 3 5 7
这需要先插入4。之后,插入需要以正确的顺序建立保持1,2,3和5,6,7的子树。这意味着我们需要在1和3之前插入2并且需要在5和7之前插入6。无论我们插入1和3的相对顺序是什么,只要它们在2之后,并且类似只要它们在6之后,我们放入5和7的相对顺序并不重要。因此你可以想到我们需要插入2 XX和6 YY,其中X是2的孩子和Y是6的孩子。然后我们可以通过查找序列2 XX和6 YY的所有交错,然后乘以4(分配X和Y的方式的数量值1)找到所有可能的方法来取回上面的树。 ,3,5和7)。
那么交错的方式有多少?那么,您可以将此视为置换序列L L L R R R的方法的数量,因为L L L R R R的每个排列告诉我们如何从左序列或右序列中进行选择。有6个! / 3! 3! = 20种方法。由于这20个交错中的每一个都给出了四个可能的插入序列,因此最终总共有20×4 = 80 可能的方法。
希望这有帮助!
答案 2 :(得分:1)
我已经创建了一个表格,其中包含可能包含1到12个元素的排列数量,高度最高可达12,并且包括每个根据故障排除任何试图检查其手动过程的人(在其他人中描述)答案)与实际值匹配。
http://www.asmatteringofit.com/blog/2014/6/14/permutations-of-a-binary-search-tree-of-height-x
答案 3 :(得分:0)
这是一个帮助接受答案的 C++ 代码,这里我没有展示明显的 ncr(i,j) 函数,希望有人会觉得它有用。
int solve(int n, int h) {
if (n <= 1)
return (h == 0);
int ans = 0;
for (int i = 0; i < n; i++) {
int res = 0;
for (int j = 0; j < h - 1; j++) {
res = res + solve(i, j) * solve(n - i - 1, h - 1);
res = res + solve(n - i - 1, j) * solve(i, h - 1);
}
res = res + solve(i, h - 1) * solve(n - i - 1, h - 1);
ans = ans + ncr(n - 1, i) * res;
}
return ans
}