因为标题表明任何人已经/知道一个算法(如果可能的话,在java中)生成所有可能的二叉树,给定叶子的数量,如下面第二个链接的例子中所示?
` N N N
/ \ / \ /\
N N N N N N
/\ /\ /\ /\
N N N N N N N N
/ \ /\
N N N N
我已经去过this,this,this和this,但我已经尝试过实施每个人,他们不做我正在寻找的事情是否正确解释。如果我必须首先生成所有可能的字符串然后将它们解析为树类型(父子关系)而第二个不打印所有树,则第一个将是大量计算。因为,例如,如果我通过指定3个内部节点执行,如上例所示,它只打印一个树(左边的那个)。我从研究加泰罗尼亚数字得知,即使对于少数节点,树木的数量也会增长很多,但对于少量节点来说却是一个有用的工具。提前致谢
答案 0 :(得分:2)
我没有检查你的所有链接,但在我看来,其中一些有一些有用的想法。要回答你的问题,不,我不知道算法,但我不认为设计一个算法太难了。
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 - 1; 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
的子类。您可能需要不同的设计。我希望你能相应地调整代码。