【问题标题】:Prolog exercise 2-3-4 treeProlog 练习 2-3-4 树
【发布时间】:2018-06-01 09:24:13
【问题描述】:

我的教授给了我一个关于 prolog 的练习。鉴于这个目标,我必须构建对应的 234 树:

写(树(1,树(11,树(111,n,n),树(112,树(1121,n,n),n)),树(12,树(121,n,n) ),树(122,n,n), 树(123,n,n),树(124,树(1241,n,n),树(1242,n,n)))))

结果应该是这样的:

你是在问我有什么问题吗?

我研究了什么是234树,但我不明白为什么我所代表的树可以被认为是234树,我看到的是从1到1242的数字。234树应该是这样的吗?

【问题讨论】:

  • 仔细查看您的示例树:树术语由节点 ID 组成,例如1 在顶部和子树。例如:节点 11 的子树tree(11,tree(111,n,n),tree(112,tree(1121,n,n),n)) 包含两个子树,即节点 111 和 112,而节点 12 的子树tree(12,tree(121,n,n),tree(122,n,n), tree(123,n,n),tree(124,tree(1241,n,n),tree(1242,n,n))) 包含四个子树,即节点 121、122、123 和 124 . 下一级,在节点124,有两个子树,节点1241和1242:tree(124,tree(1241,n,n),tree(1242,n,n))
  • 另外,我建议将子树保留在列表中。这将使术语树更具可读性,因为它始终具有两个子术语,即节点 id 和列表,并且您可以将这样的术语用于具有任意数量的后继节点的树,因为它们始终包含在列表中。
  • 您显示为 Prolog 术语的树似乎具有真正代表某种节点索引(用于说明目的)的值(1、11、12、111 等)而不是节点值。如果它们是值,则树的顺序将不正确,除非您的排序指标不是严格的数字。
  • 那么,为什么12在1的左边,11在右边呢?
  • 事实是,现在我不明白产生我在第一篇文章中展示的 234 树的标准是什么。

标签: algorithm data-structures tree prolog


【解决方案1】:

这是你给定的术语,为了清楚起见,打印得很漂亮:

tree(1,      % has 2 child nodes
      tree(11,       % has 2 child nodes
             tree(111,n,n),     % a leaf
             tree(112,          % has 2 child nodes
                     tree(1121,n,n),          % a leaf
                     n)),                     % empty
      tree(12,       % has 4 child nodes
             tree(121,n,n),     % a leaf
             tree(122,n,n),     % a leaf
             tree(123,n,n),     % a leaf
             tree(124,          % has two child nodes
                     tree(1241,n,n),          % a leaf
                     tree(1242,n,n))))        % a leaf

很明显,“数字”11112、...、1242 不是用于它们的数值,而只是作为替代品。换句话说,这些值并不重要。一棵有效的树已经建立。

这棵树的每个节点都有 24 个子节点(可能为空,由n 表示)。这就是为什么它被认为是一棵2-3-4树,其中每个节点被允许有23或4 个子节点(可能为空)。

然后你的问题就变成了,给定一个由 Prolog 复合术语表示的 2-3-4 树,像上面那样,打印树 以漂亮的视觉方式为显示在您所附的图片中。

这可以通过简单地将嵌套子树的打印与节点值的打印交换来实现:

print_tree( n ).
print_tree( tree(A,B,C) ) :- print_tree(B), 
                             print_node_value(A), 
                             print_tree(C).
print_tree( tree(A,B,C,D) ) :- print_tree(B), 
                             print_node_value(A), 
                             print_tree(C),
                             print_tree(D).
print_tree( tree(A,B,C,D,E) ) :- print_tree(B), 
                             print_tree(C),
                             print_node_value(A), 
                             print_tree(D),
                             print_tree(E).

您必须通过传入所需的缩进级别来增加它,并在打印子节点时将其增加相同的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    相关资源
    最近更新 更多