可以形成的不同二叉树的数量?

时间:2011-01-16 11:05:47

标签: c algorithm binary-tree

二叉树,其中每个节点最多有两个子节点,子节点可能包含对其父节点的引用。

we do not differentiate the nodes and all nodes are considered identical.我们如何找到可以用N个相同节点形成的不同二叉树的数量。

例如:如果3个节点则5个差异树     如果7个节点然后429树

3 个答案:

答案 0 :(得分:1)

递归是你的朋友!

伪码:

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)in_order)。

内存效率不是很高,但是它通过简单的递归来解决问题,在每个阶段我都会拿树并遍历所有树叶,并以各种可能的方式添加我的新节点。

答案 1 :(得分:1)

(2N)!/ [(N + 1)!* N!]

看看:

http://www.theory.csc.uvic.ca/~cos/inf/tree/BinaryTrees.html

答案 2 :(得分:0)

现在,如果你真的想要了解这一点,你可以查看“计算机程序设计的艺术”,第4卷,分册4:Generating all trees,而不是仅仅获得(或试验找到)答案。