当前位置: 首页 > 知识库问答 >
问题:

检查树是否是最小堆

浦毅
2023-03-14

如何让prolog中的谓词返回值?

我需要找到一个树的节点,并检查它是否是一个最小堆。我猜是这样的:-

getnode(tree(_, node, _), node).

到目前为止我的代码是这个

minheap(tree(L, Node, empty)) :-
    getnode(L, Val),
    Node =< Val,
    minheap(L).
minheap(tree(empty, Node, R)) :-
    getnode(R, Val),
    Node =< Val,
    minheap(R).

getnode(tree(_,n,_)  , n).

输入的类型是-

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

输出应该为真。

共有1个答案

林铭
2023-03-14

为了解决这个问题,你最好定义一些使生活更简单的效用谓词。

例如谓词< code>lower/2。如果< code>Tree为< code>empty,或者< code>Tree的值大于< code>Value,则< code>lower(Tree,Value)成功。所以你可以这样实现:

lower(empty,_).
lower(tree(_,TreeValue,_),Value) :-
    TreeValue >= Value.

接下来我们定义谓词minheap/1树绝对是minheap。此外,如果树的子级较低,并且所有子级都是minheap/1本身,则树就是minheap,所以:

minheap(empty).
minheap(tree(Left,Value,Right)) :-
    lower(Left,Value),
    lower(Right,Value),
    minheap(Left),
    minheap(Right).

就是这样。这比尝试在minheap/1谓词中完成所有工作要好,因为在这种情况下,您应该处理五种情况:树(空,val,空)树(…),val,空)树(空,val,树(…))树(树(…),val,树(…))。通过使用下/2帮助谓词,我们只需要处理两种情况:树/3

 类似资料:
  • QSTN:当它是叶节点时,为什么需要初始化ls=0或rs=0。考虑链接中给出的树,如果我们到达节点4,如果(node==NULL isLeaf(node))返回1;上面的代码将1(true)返回到调用它的函数,即节点10,类似地,右侧将true返回到节点10,因此我们现在可以进入下面的循环,因为如果(isSumTree(node->left)&&isSumTree(node->left)&&isS

  • 我试图根据浏览器的最小高度和最小宽度在我的页面上更改CSS,所以我使用这个: 但出于某种原因,这不起作用。我可以检查“最小高度”和“最大宽度”(反之亦然),或者同时检查“最大高度”和“最大宽度”,但检查“最小高度”和“最大宽度”似乎都不起作用。 我应该详细说明这一点:我希望浏览器在最小高度或最小宽度变为真时起作用。仅当两个条件均为真时,使用and运算符才有效。 我做错什么了吗?

  • 给定两个头引用为T和S的二叉树,最多有N个节点。任务是检查S是否作为T中的子树存在。树T1的子树是由T1中的一个节点和T1中的所有它的后代组成的树T2。 为什么我的方法失败了? 我的algo是:-找到T的inorder和preorder遍历,将它们存储在两个列表中。查找%S的inorder和preorder遍历,将它们存储在两个列表中。如果T的inorder和preorder列表出现在S的inor

  • 我实现了下面的C代码,以检查二叉树是否平衡,即左右子树的高度相差最多1。但是,我不确定它是否有效,或者以错误的方式重复检查子树。有人能引导我吗?

  • 我知道如何检查给定的树是否是二叉树。但问题是,如果树包含重复的值,该怎么办。 如何检查可能包含重复值的树是否是二叉查找树重复值必须位于树/子树的右侧。

  • 我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?