二叉树,其中每个节点最多有两个子节点,子节点可能包含对其父节点的引用。
we do not differentiate the nodes and all nodes are considered identical.
我们如何找到可以用N个相同节点形成的不同二叉树的数量。
例如:如果3个节点则5个差异树 如果7个节点然后429树
答案 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)
答案 2 :(得分:0)
现在,如果你真的想要了解这一点,你可以查看“计算机程序设计的艺术”,第4卷,分册4:Generating all trees,而不是仅仅获得(或试验找到)答案。