рекурсия - твой друг!
псевдо-код:
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).
не очень эффективно использует память, но решает проблему с помощью простой рекурсии, где на каждом этапе я беру деревья, перебираю все листья и всячески добавляю свой новый узел.