Prolog中的代码生成具有n个节点的所有结构上不同的完整二叉树

时间:2012-09-14 05:21:57

标签: algorithm prolog catalan

在Prolog中生成具有n个叶子的所有结构上不同的完整二叉树。 问题是叶子的数量,输出所有不同的完整二叉树。 这里的“完整”意味着任何内部节点必须有两个孩子,左和右。

1 个答案:

答案 0 :(得分:1)

通过回溯构建所有树:

full_tree(Leaves, [LTree, RTree]):-
  Leaves > 1,
  TLeaves is Leaves-1,
  between(1, TLeaves, LLeaves),
  RLeaves is Leaves-LLeaves,
  full_tree(LLeaves, LTree),
  full_tree(RLeaves, RTree).
full_tree(1, '.').

这个递归过程有一个基本案例,它将第二个参数与'。'统一起来。当叶子的数量是1。 当叶子的数量大于1时,递归步骤适用。它将这个数字拆分为两个非零的新数字,它们对叶子的数量求和并调用自身来构建左右分支。

然后,此过程将所有树转储到控制台:

dump_all_trees(Leaves):-
  full_tree(Leaves, Tree),
  dump_full_tree(Tree),
  nl,
  fail.
dump_all_trees(_).

dump_full_tree([LTree, RTree]):-
  write('('),
    dump_full_tree(LTree),
    dump_full_tree(RTree),
  write(')'),
  !.
dump_full_tree(Leaf):- write(Leaf).

测试用例:

?- dump_all_trees(4).
(.(.(..)))
(.((..).))
((..)(..))
((.(..)).)
(((..).).)