prolog - 计算二叉树中的节点

时间:2021-05-03 23:14:20

标签: prolog

我的请求与我在 stackoverflow 上看到的不同。假设我的二叉树的形式是 tree(Node, Leafs)。没有左叶或右叶,只有属性 leafs

你会如何计算那棵树中的节点?

例如树可以是:

tree(node1, [tree(node2)]), tree(node3, []), tree(node4, [tree(node6,[tree(node2,[])]).

1 个答案:

答案 0 :(得分:1)

无序二叉树是一种树,其中每个节点最多可以有两个子节点,但是子节点之间的顺序并不重要。因此,非空无序二叉树中的每个节点都可以表示为 tree(Node,Children) 形式的项,其中 Children 是空集(如果 Node 是叶子),或一组一两棵树(如果 Node 是内部节点)。空的无序树可以表示为 nil。为了简化实现,我们可以将集合表示为列表。例如无序二叉树:

    a
   / \
  b   c
 / \  |
d   e f

可以表示为:

mytree(tree(a,
            [tree(b,
                  [tree(d,[]),
                   tree(e,[])]),
             tree(c,
                  [tree(f,[])])])).

要计算无序二叉树中的节点数,我们可以使用 maplist/3sum_list/2 如下:

count_nodes(nil, 0).
count_nodes(tree(_Root, Children), N) :-
    maplist(count_nodes, Children, Ns), % call count_nodes, recursively, for each child
    sum_list([1|Ns], N).                % add 1 to count the root

以下是一些示例:

?- count_nodes(nil, N).
N = 0.

?- count_nodes(tree(a,[]), N).
N = 1.

?- count_nodes(tree(a,[tree(b,[])]), N).
N = 2.

?- count_nodes(tree(a,[tree(b,[]),tree(c,[])]), N).
N = 3.

?- mytree(T), count_nodes(T, N).
T = tree(a, [tree(b, [tree(d, []), tree(e, [])]), tree(c, [tree(f, [])])]),
N = 6.
相关问题