Java 给定n个叶生成所有可能的二叉树

Java 给定n个叶生成所有可能的二叉树,java,algorithm,tree,binary-tree,permutation,Java,Algorithm,Tree,Binary Tree,Permutation,因此,正如标题所示,如果可能的话,任何人都有/知道java中的一种算法,在给定叶数的情况下生成所有可能的二叉树,如下面第二个链接的示例所示 ` N N N / \ / \ /\ N N N N N N /\ /\ /\ /\ N N

因此,正如标题所示,如果可能的话,任何人都有/知道java中的一种算法,在给定叶数的情况下生成所有可能的二叉树,如下面第二个链接的示例所示

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

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

我没有检查你的所有链接,但在我看来,其中一些链接有一些有用的想法。回答你的问题,不,我不知道有什么算法,但我认为设计一个算法不会太难

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;
}

在上面我假设InternalNode和Leaf都是TreeNode的子类。您可能需要不同的设计。我希望您可以相应地调整代码。

我没有检查您的所有链接,但在我看来,其中一些链接有一些有用的想法。回答你的问题,不,我不知道有什么算法,但我认为设计一个算法不会太难

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;
}

在上面我假设InternalNode和Leaf都是TreeNode的子类。您可能需要不同的设计。我希望您可以相应地调整代码。

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