问题是,有多少种方法可以用15个元素构建一个完美平衡的二叉树?
一种可能性是8-4-12-2-6-10-14-1-3-5-7-9-11-13-15 ..
我的想法是编写一些代码来生成所有可能的排列(就像...... 15!)然后删除那些不正确的排列。
正确者有8作为第一个元素,4总是在2和6之前,2总是在1和3之前,6总是在5和7之前,依此类推。
但perms2 = list(itertools.permutations([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))
之类的内容会导致内存错误。
有没有办法用上面的规则生成排列?
或者是否有更简单的方法来解决我的问题?
Btw ..
但这并没有帮助我得到某种公式..
编辑:这是我正在谈论的树:http://666kb.com/i/bz9znnpdj7etw0fo9.gif
答案 0 :(得分:2)
正确的数字是21964800.这是适当的整数序列:
基本上你递归地增加了可能性: 在最低级别,您可以选择两种可能性,例如:2-1-3和2-3-1。在上面的级别,您可以纠缠两个较低层的选定顺序(6比3) 方式等等。
答案 1 :(得分:1)
我不确定你完全平衡的意思。但是如果你的意思是左右节点的数量对于每个节点都是相等的而你有15个元素[1-15]那么2 ^ 4 -1个元素就可以拥有这样一个树。因为四个级别的完整二叉树正好有15个元素。
同样根据您的问题,您似乎意味着一个完整的二叉搜索树。有15个元素(1-15),只有一个这样的树可能。
考虑根节点中的内容。什么数字是1-15的确切中位数。它只有8和8。所以只有8个可以在根。如果您使用归纳,您将得出结论,所有节点只有一个可能的值
答案 2 :(得分:0)
可能有一个公式可以找到。看到一棵小树有多少可能性。
例如,对于3个不同的元素,只有1个可能的树。
4,有2
对于5,有3个
对于6,只有2个(根为3和4,其余为隐含)
对于7,只有1。
对于15,给定一个根,有14个要放置的元素,恰好是7 + 7,只能用一种形式表示,所以我对你的问题的猜测是只有一个解,8是根。
答案 3 :(得分:0)
根据你对完美平衡的定义,结构中的所有变化都发生在树的最深层,所以你只需要担心那个层次。
具有高度h的最大平衡树将具有2 ^(h-1)个叶子 - 例如对于高度1,唯一的叶子是根。这些都是最深层次的。
高度为h的最小平衡树只有一个节点处于最深层。
因此,构建完美平衡二叉树的方法数量与最深层1到2 ^(h-1)节点之间的方式数相同。
有2 ^(h-1)个节点可能存在或不存在于该级别(组合问题,而不是排列),因此您得到2 ^(2 ^(h-1))个可能性,其中只有一个(“无”情况)无效。
所以我认为你的答案是(2 ^(2 ^(h-1))) - 1。所以,如果你能确定正确的......
假设二元搜索树(项目值唯一且按顺序),因此二叉树完全由选择哪个最深层节点确定。否则,将它乘以值序列的排列数。
注意我对h的定义 - 零高度树根本没有节点,并且给出一个无意义的结果 - sqrt(2)-1在至少两种意义上是一个无理的答案。
修改强>
马克斯的评论让我想到了更多。对于特定的高度,我认为我的答案是正确的。问题是特定高度允许各种不同数量的总节点,因为它允许最深层中的各种不同数量的节点。所以我无法通过这种方式得到一个特定节点的正确答案。所以......让我们再试一次......
如果我们的树有高度h,它总共最多可以有(2 ^ h)-1个节点。排除最深层次,它有(2 ^(h-1)) - 1个节点 - 所有节点都必须存在。
我们有最深层次的c - ((2 ^(h-1)) - 1)节点,我们可以选择从最深处的2 ^(h-1)个可能位置放置这些节点的位置水平。我用c来计算,因为我想定义......
n = 2^(h-1)
k = c-((2^(h-1))-1)
answer = n choose k
我仍然没有从c中得到h - 它应该是基数2对数的最低点,但我有一种一种感觉。