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
成指数关系,则您的算法不是一个好的选择。