【问题标题】:Generating all possible binary trees given n leaves给定n个叶子生成所有可能的二叉树
【发布时间】:2016-12-24 09:10:04
【问题描述】:

所以正如标题所暗示的那样,任何人都知道一种算法(如果可能的话,在 java 中)在给定叶子数量的情况下生成所有可能的二叉树,如下面第二个链接的示例所示?

` N                  N                  N
 / \                / \                 /\
N   N               N  N               N  N
/\   /\             /\                     /\
N  N  N N           N  N                    N N
                   / \                        /\
                   N  N                       N N 

我已经去过thisthisthisthis,但我已经尝试实现每一个,但他们没有做我正在寻找的事情或没有正确解释。如果我必须首先生成所有可能的字符串然后将它们解析为树类型(父子关系)并且第二个不打印所有树,那么第一个将是大量计算。因为,例如,如果我像上面的示例一样通过指定 3 个内部节点来执行,它只会打印一棵树(左侧的那棵)。我通过研究加泰罗尼亚数字知道,即使对于少量节点,树的数量也会增长很多,但对于少量节点来说是一个有用的工具。

【问题讨论】:

  • 只是想知道:您试图通过计算二叉树中对象的可能“排列”来解决什么问题?
  • @GhostCat 也许他正试图找到“最佳”迭代?但话又说回来,解决这个问题的方法就是平衡树
  • @GhostCat 对,我正在为一个你玩树的游戏构建一个 AI,我希望它有所有的可能性,但在游戏的后期阶段丢弃没有用的树。
  • 你描述问题的方式可能有无限的解决方案......
  • @Roberto De La Parra 抱歉,也许我没有正确解释自己。但并非如此,因为您将只有 (2n) 给出的第 n 个加泰罗尼亚数的解数! / (n+1)!n!。所以对于 n = 4(在这种情况下,n 是内部节点的数量)有 14 种可能的树(见第一个链接)。所以艾知道我有这 14 棵树中的任何一棵。

标签: java algorithm tree binary-tree permutation


【解决方案1】:

不,我不知道算法,但我认为设计一个算法不会太难:

List<TreeNode> allBinaryTrees(int numberOfLeaves) {
    if (numberOfLeaves < 1) {
        throw new IllegalArgumentException("Number of leaves must be positive");
    }
    List<TreeNode> result = new ArrayList<>();
    if (numberOfLeaves == 1) {
        // return a single tree consisting of a single leaf node
        result.add(new Leaf());
        return result;
    }
    for (int sizeOfLeftSubtree = 1; sizeOfLeftSubtree < numberOfLeaves; sizeOfLeftSubtree++) {
        List<TreeNode> possibleLeftSubtrees = allBinaryTrees(sizeOfLeftSubtree);
        List<TreeNode> possibleRightSubtrees = allBinaryTrees(numberOfLeaves - sizeOfLeftSubtree);
        for (TreeNode lt : possibleLeftSubtrees) {
            for (TreeNode rt : possibleRightSubtrees) {
                // make a tree of a node with lt and rt as subtrees,
                // and add it to the result
                result.add(new InternalNode(lt, rt));
            }
        }
    }
    return result;
}

在上面我假设InternalNodeLeaf 都是TreeNode 的子类。

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2019-08-25
    相关资源
    最近更新 更多