编写一个谓词is_heap(Tree),如果Tree满足堆属性,则返回true,否则返回false

时间:2017-04-04 12:06:02

标签: prolog

如果对于树中的每个非叶节点,存储在该节点的数字小于或等于该数字,则二进制数字树称为堆(或者,它被称为满足堆属性)存储在每个孩子身上。例如,以下树满足堆属性,因为3≤5,5≤8且5≤7。

tree(empty,3,tree(tree(empty,8,empty),5,tree(empty,7,empty)))

另一方面,以下树不满足堆属性,因为6不小于或等于5.

tree(tree(tree(empty,4,empty),
        3,tree(empty,5,empty)),6,tree(tree(empty,9,empty),7,empty))

示例:

?- is_heap(tree(tree(tree(empty,4,empty),
         3,tree(empty,5,empty)),6,tree(tree(empty,9,empty),7,empty))).
false.

?- is_heap(tree(empty,3,tree(tree(empty,8,empty),5,tree(empty,7,empty)))).
true 

任何帮助都会得到满足。

1 个答案:

答案 0 :(得分:1)

你可以这样开始。树在tree(Value, Left, Right),但您可以轻松更改。然后你开始:

is_heap(empty).
is_heap(tree(X, L, R)) :-
    is_heap(L, X),
    is_heap(R, X).

现在你只需要写is_heap/2,然后就可以了。类似的东西:

is_heap(empty, ...).
is_heap(tree(X, L, R), X0) :-
    ...,
    is_heap(L, X),
    ....