【问题标题】:Code in Prolog generate all structurally distinct full binary trees with n nodeProlog 中的代码生成所有结构不同的具有 n 个节点的完整二叉树
【发布时间】:2012-09-14 05:21:56
【问题描述】:

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

【问题讨论】:

    标签: algorithm prolog catalan


    【解决方案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).
    (.(.(..)))
    (.((..).))
    ((..)(..))
    ((.(..)).)
    (((..).).)
    

    【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2013-09-10
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2017-04-15
    • 1970-01-01
    相关资源
    最近更新 更多