给定数组的多少个排列导致BST的高度为2?

时间:2013-06-14 23:37:22

标签: algorithm data-structures tree permutation binary-search-tree

从集合{1,2,3,4,5,6,7}中的每个密钥排列生成(通过连续插入节点)BST。有多少个排列确定了高度为2的树木?

我一直坚持这个简单的问题。任何暗示任何人。

顺便说一下答案是80。

4 个答案:

答案 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
}