C 可以形成的不同二叉树的数量?
二叉树,其中每个节点最多有两个子节点,子节点可以包含对其父节点的引用C 可以形成的不同二叉树的数量?,c,algorithm,binary-tree,C,Algorithm,Binary Tree,二叉树,其中每个节点最多有两个子节点,子节点可以包含对其父节点的引用 我们不区分节点,所有节点都被认为是相同的。我们如何找到由N个相同节点组成的不同二叉树的数量 例如:如果有3个节点,则有5个差异树 如果有7个节点,那么429棵树就是你的朋友 伪代码: numOfTrees(n): return trees(n).size(); trees(n): if (n==1) return new list of single node; big_trees = new empt
我们不区分节点,所有节点都被认为是相同的。
我们如何找到由N个相同节点组成的不同二叉树的数量
例如:如果有3个节点,则有5个差异树如果有7个节点,那么429棵树就是你的朋友 伪代码:
numOfTrees(n):
return trees(n).size();
trees(n):
if (n==1)
return new list of single node;
big_trees = new empty list;
for (small_tree : trees(n-1))
for (big_tree : addSingleNode(tree))
big_trees.insert(big_tree);
return big_trees;
addSingleNode(tree):
trees = new empty list;
for (leaf : getLeaves(tree)) {
trees.insert(tree.clone().addLeftChild(leaf, node));
trees.insert(tree.clone().addRightChild(leaf, node));
}
return trees;
getLeaves()依赖于实现,如果您有一个包含所有叶子的链表,那么它会很快完成,否则您可能需要遍历树来检查叶子(按O(n)的顺序)
内存效率不是很高,但它通过简单的递归解决了这个问题,在每个阶段,我都会选择树,遍历所有的叶子,并以各种可能的方式添加我的新节点。(2n)/[(n+1)!*n!]
看看:
现在,如果你真的想了解这一点,而不是仅仅获得(或尝试寻找)答案,你可以查看“计算机编程艺术”,第4卷,第4分册:。提示:谷歌搜索“加泰罗尼亚数字”@Bart Kiers,我想,问题不是加泰罗尼亚数字,因为没有等于
5
(参见OPs示例)的加泰罗尼亚数字。或者我认为对429
@Saeed来说,你错了。前几个加泰罗尼亚数字是:非常感谢。我会查出来的,谢谢。这是针对加泰罗尼亚语的公式。我没有充分考虑递归算法的正确性,但正如我看到的,您尝试了建设性的方法,但如果树的数量与n
成指数关系,则您的算法不是一个好的选择。