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

在PROLOG中查找二叉树中的元素

田念
2023-03-14

我正在尝试使用Prolog实现它以在二叉树中查找元素。

elem1(tree(Element,void,void),Element).

elem1(tree(_Element,Left,Right),N) :-
  elem1(Left,N), 
  elem1(Right,N).

因为我认为< code>elem1检查我的树的根是否是我搜索的一个元素,并且它处理这个输出。

?- trace,elem1(tree(c,void,void),c).
Call: (9) elem1(tree(c, void, void), c) ? creep
Exit: (9) elem1(tree(c, void, void), c) ? creep
true

但是以这样的递归方式:

  ?- trace,elem1(tree(4,tree(1,void,void),tree(2,void,void)),1).
  Call: (9) elem1(tree(4, tree(1, void, void), tree(2, void, void)), 1) 
  creep
  Call: (10) elem1(tree(1, void, void), 1) ? creep
  Exit: (10) elem1(tree(1, void, void), 1) ? creep
  Call: (10) elem1(tree(2, void, void), 1) ? creep
  Call: (11) elem1(void, 1) ? creep
  Fail: (11) elem1(void, 1) ? creep
  Fail: (10) elem1(tree(2, void, void), 1) ? creep
  Redo: (10) elem1(tree(1, void, void), 1) ? creep
  Call: (11) elem1(void, 1) ? creep
  Fail: (11) elem1(void, 1) ? creep
  Fail: (10) elem1(tree(1, void, void), 1) ? creep
  Fail: (9) elem1(tree(4, tree(1, void, void), tree(2, void, void)), 1) ? 
  creep

  false.

似乎调用正确的方式(10)并检查正确的谓词,但之后尝试扩展更多并给我一个失败。

我不知道为什么会发生这种情况,但基本情况很好,所以我认为当找到一个元素时,退出并给出true,因为基本谓词是有效的。

共有1个答案

澹台蕴藉
2023-03-14

您的代码稍加html" target="_blank">修改,以显示和(,)的用法。

elem_01(tree(Element,void,void),Element).

elem_01(tree(_Element,Left,Right),N) :-
  (
    elem_01(Left,N)
  ,
    elem_01(Right,N)
  ).

例子:

?- elem_01(tree(4,tree(1,void,void),tree(2,void,void)),1).
false.

这给出了不正确的结果。

使用或(;).

elem_02(tree(Element,void,void),Element).

elem_02(tree(_Element,Left,Right),N) :-
  (
    elem_02(Left,N)
  ;
    elem_02(Right,N)
  ).

例子:

?- elem_02(tree(4,tree(1,void,void),tree(2,void,void)),1).
true ;
false.

在二叉树中正确查找< code>1。

?- elem_02(tree(4,tree(1,void,void),tree(2,void,void)),3).
false.

正确显示3不在树中。

已更正版本,显示使用了两个子句,而不是OR(;).

elem_03(tree(Element,void,void),Element).

elem_03(tree(_Element,Left,_),N) :-
    elem_02(Left,N).

elem_03(tree(_Element,_,Right),N) :-
    elem_02(Right,N).

例子:

?- elem_03(tree(4,tree(1,void,void),tree(2,void,void)),1).
true ;
false.

在二叉树中正确查找< code>1。

?- elem_03(tree(4,tree(1,void,void),tree(2,void,void)),3).
false.

正确显示3不在树中。

在你的问题中,你把树显示为

elem1(tree(4,tree(1,void,void),tree(2,void,void)),1).

e. g. g.

  4
 / \
1   2

虽然它是一个二叉树,但它不是一个正确的二叉树,其中左边的键小于根,右边的键大于根。

您需要按此方式键入键的原因是,您可以在搜索时使用比较,这样就不必搜索整个树。

您的代码可以工作,但是如果缺少值,它必须搜索整个树。如果您有一棵非常大的树并且没有匹配,那么如果您正确构建树并将比较添加到代码中,您可以更快地发现它丢失了。

这是一个适合您的示例的树:

elem1(tree(2,tree(1,void,void),tree(4,void,void)),1).

e. g. g.

  2
 / \
1   4
 类似资料:
  • 我试图编写一个Prolog谓词,为给定的遍历提供一个可能的二叉搜索树。我选择将树表示为,叶子就是,当子树不存在时,它的值是。 这是我到目前为止所做的(仅适用于本例中的后序遍历): 这在一个方面很好,但在另一个方面却很好: 我意识到不需要二叉搜索树,也就是说,不需要左子树中的所有节点都小于根节点,右子树中的所有节点都大于根节点,所以我还写了以下内容: 我想我可以做使Prolog只返回实际的二进制搜索

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个

  • 我有下面的“height”函数,它返回树的高度。然而,当我尝试使用它时,我得到了这个异常。我怎样才能修好它?我还有一个函数“isBalancedTree”,它检查给定的树是否平衡。 *主要 ***异常:函数高度中的非穷尽模式

  • 我们已经看到了两种不同的方法来获取集合中的键值对。回想一下,这些集合实现了 map 抽象数据类型。我们讨论的 map ADT 的两个实现是在列表和哈希表上的二分搜索。在本节中,我们将研究二叉查找树作为从键映射到值的另一种方法。 在这种情况下,我们对树中项的确切位置不感兴趣,但我们有兴趣使用二叉树结构来提供高效的搜索。

  • 我希望在BST中找到具有特定值的节点的父节点。我的节点类具有左右属性项(即值/键)。 查找父级的想法是这样的: 1)如果值(key)不存在,则返回无,无 2)如果根等于值(key),则返回无,根 3)否则查找值(key)并返回(par, node),其中par是父级和节点 我的函数是这样的: 当 为“无”时,如何处理该问题?