如何让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)))).
输出应该为真。
为了解决这个问题,你最好定义一些使生活更简单的效用谓词。
例如谓词< 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,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?