Prolog:如何用任意数量的子树计算树的深度?

时间:2016-08-31 13:44:09

标签: prolog

我用这样的任意但有限的子树表示树:

tree(empty).
tree(branch(R, Ts)) :- integer(R), isTreeList(Ts).

isTreeList([]).
isTreeList([T | Ts]) :- tree(T), isTreeList(Ts).

(如果这种表述好或坏,请忽略,这只是为了提出这个问题)

This帖子显示了如何计算二叉树的深度。到目前为止我的进展:

depth(tree(empty), 0).
depth(tree(branch(_, SubTrees), D) 
    :- < calculate somehow the depths D1, ..., Dn of the subtrees >
    ,  max_list([D1, ..., Dn], MaxD)
    ,  D is MaxD + 1

如何确定D1, ..., Dn

编辑:根据@CapelliC,以下是该问题的一种解决方案:

depth(tree(empty), 0).
depth(tree(branch(_, SubTrees), D) 
    :- maplist(depth, SubTrees, Depths)
    ,  max_list(Depths, MaxD)
    ,  D is MaxD + 1

请注意,如果SubTrees为空列表,则会失败 - @ max66的解决方案仍然有效。

1 个答案:

答案 0 :(得分:1)

每次计算列表中的值时,都可以检查最大值。

我的意思是

depth(tree(empty), 0).
depth([], 0).
depth([T | L], D) :-
  depth(T, D0),
  depth(L, D1),
  D is max(D0, D1).
depth(tree(branch(_, SubTrees)), D) :-
  depth(SubTrees, D0),
  D is D0+1.