插入(I,[],[I,[],[]])。如何向二叉树插入一个值?

2024-02-02

要将新元素添加到堆中,我们必须:

  1. 创建一个包含该元素值的节点,
  2. 在最后一层的第一个空位置尽可能向左打结(如有必要,创建一个新层)。我们总是得到一个完整的二叉树,但不一定是一个堆。

我写了这段代码:

insert(I, [], [I, [], [] ] ).
insert(I, [_, G, D], N):-
   depth(G, P1), depth(D, P2), P1<P2, insert(I, G, N).
insert(I, [_, G, D], N):-
   depth(G, P1), depth(D, P2), P1>P2, insert(I, D, N).

depth([], 0).
depth([_, Y, Z], H):-
   depth(Y, H1), depth(Z, H2), max(H1, H2, H3), H is 1+H3.

但是当执行这个查询时,它失败了:

?- insert(2, [19, [18, [12, [], []], [15, [], []]], [17, [10, [], []], [16, [], []]]], N).
false.

Why?


((你没有定义max/3在你的程序中。我猜是下面的))

max(A, B, M) :-
   M is max(A,B).

Why?

首先,总是从小例子开始。就像一棵只有一个元素的树。这也失败了:

?- insert(2, [12, [], []], N).
false.

所以为什么?如果一个(纯粹的、单调的)程序失败了,那么我们需要对其进行概括。让我们像这样尝试一下:



:- op(950, fy, *).
*(_).

insert(I, [], [I, [], [] ] ).
insert(I, [_, G, D], N):-
   depth(G, P1),
   depth(D, P2),
   P1<P2,
   * insert(I, G, N).
insert(I, [_, G, D], N):-
   depth(G, P1),
   depth(D, P2),
   P1>P2,
   * insert(I, D, N).
  

因此,这些递归目标已通过添加*前面的概括显然太过分了。然而,查询仍然失败!所以这些P1<P2, P1>P2比较似乎是罪魁祸首。如果它们相同会发生什么?那么这两条规则都不适用。所以你显然忘记考虑这种情况。

但还有一个问题,让我们忽略这些比较,看看会发生什么:



insert(I, [], [I, [], [] ] ).
insert(I, [_, G, D], N):-
   depth(G, P1),
   depth(D, P2),
   * P1<P2,
   insert(I, G, N).
insert(I, [_, G, D], N):-
   depth(G, P1),
   depth(D, P2),
   * P1>P2,
   insert(I, D, N).

?- insert(2, [12, [], []], N).
   N = [2,[],[]]
;  N = [2,[],[]].
?- insert(2, [19, [18, [12, [], []], [15, [], []]], [17, [10, [], []], [16, [], []]]], N).
   N = [2,[],[]]
;  N = [2,[],[]]
;  N = [2,[],[]]
;  N = [2,[],[]]
;  N = [2,[],[]]
;  N = [2,[],[]]
;  N = [2,[],[]]
;  N = [2,[],[]].
  

这可以吗?无论我们从哪棵树开始,我们总是会得到一个解决方案。因此,无论您想在哪里插入新元素,您都必须解决这个问题。

如果我在,请考虑使用clpfd /questions/tagged/clpfd via library(clpz)或其稍微过时的前身library(clpfd)代替(>)/2等等,因为这不会给你带来那么多错误。

See 这个答案 https://stackoverflow.com/a/30791637/772868了解更多针对 Prolog 的调试方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

插入(I,[],[I,[],[]])。如何向二叉树插入一个值? 的相关文章

  • 针对数字板难题的优化 CLP(FD) 求解器

    考虑问题从https puzzling stackexchange com questions 20238 explore the square with 100 hops https puzzling stackexchange com
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 在 Prolog、尾递归中计算斐波那契数列

    我想在 Prolog 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • 在列表列表中查找形状

    节目说明 该计划的目的 我的程序旨在计算 20X15 大小的平面中形状的位置 我有一个形状列表 其中包含形状类型 其 ID 半径或高度以及其在平面上的预期 X Y 位置 我有一个不同的二元运算列表 仅包含形状类型 其 id 及其与另一个形状
  • 根据一个值找到列表内列表的最小值

    我在序言中有这个列表 dublin london 1000 dublin moscow london 5000 我想计算列表的最小值 这样答案应该是 dublin london 1000 这个问题有一些类似的问题序言中列表列表中的最小值 h
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • 查找相邻成员

    我必须找出列表中的两个成员是否相邻 限制是使用append 3谓词 到目前为止 我已经完成了下面的操作 如果它是真的 它就有效 否则我得不到答案 就像它永远运行一样 adjacent X Y L append L1 X Y T1 appen
  • 将 X 插入到排序列表中的正确位置

    在序言中 如何将 X 插入到排序列表中的正确位置 我的尝试 insert X Y Rest X Y Rest X lt Y insert X Rest BiggerRest 您的方向是正确的 但您需要解决这三个问题 insert X X i
  • 高阶“解决方案”谓词

    我正在使用一个更高阶的 Prolog 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • Prolog - 通过演绎减少知识库

    我需要创建一个规则来搜索与 my rule 匹配的事实 这些事实将用于改变知识库 my rule Conclusion Premise 我有这个知识库可以开始 dynamic is 2 is m1 house is m1 thing is
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • 将行读取到序言中的原子列表

    我需要将任何行 来自 user input 读入原子列表 例如 Example line which contains any ASCII chars into Example line which contains any ASCII c

随机推荐

  • 使用 ReactJS 映射数组的数组

    所以我想做的是映射数组的数组 首先 我从简单开始并开始工作 一个简单的国家 地区数组 嗯 国家 地区代码 countries map value index gt return span h2 Hello world h2 hr span
  • 在 CustomScrollView 中使用 StreamBuilder 和 SliverLists

    我正在尝试使用StreamBuilder获取数据 我想使用显示该数据SliverList全部在一个CustomScrollView这样我就可以利用附带的功能CustomScrollView 关于如何实现这一目标有什么想法吗 当然 这很简单
  • 使用单个控制器控制多个 html5 音轨

    我正在尝试为网站实现一个非常小的音频播放器 界面相当简单 它有一个播放 暂停按钮和一个静音 取消静音按钮 我遇到的问题是为不同的曲目实现同一播放器的多个实例 播放器的 javascript 是 jQuery function var myA
  • 多个 ACS 网址

    我们使用 PingFederate 进行 SSO 并且是 SP 发起的 Ping Federate 将像 Idp 一样行事 对于应用程序 有 2 个网络服务器 用于高可用性 我的问题是 1 我们可以提供两个默认的url 在控制台中只能设置一
  • 如何使用 Gson 反序列化 ConcurrentMap

    我正在尝试反序列化一个具有ConcurrentMap但我得到了一个例外 Caused by java lang IllegalArgumentException Can not set java util concurrent Concur
  • 访问 Meteor 中的 node.js 文件系统模块

    我正在创建一个网络应用程序 它将编辑存储在用户硬盘上的一些配置文件 并决定尝试一下 Meteor 我想使用 Node js 的文件系统模块来处理配置文件的 I O 但我无法弄清楚如何包含该模块 经过一番搜索 我在 StackOverlow
  • 使用 Google Drive .NET API 创建文件的空响应

    我正在尝试使用 Google Drive NET API v3 将文件上传到我的云端硬盘 我的代码如下 static string Scopes DriveService Scope Drive DriveService Scope Dri
  • CUDA:从内核调用 __device__ 函数

    我有一个内核调用deviceif 语句中的函数 代码如下 device void SetValues int ptr int id if ptr threadIdx x id question related to here ptr thr
  • 部署 lambda 函数时如何从无服务器获取 API 网关 ID 作为输出部分

    我想在无服务器的输出部分获取API网关的ID 然后将其转换为我的API URL https fgh5t4tjm2 execute api us east 1 amazonaws com dev 在另一个无服务器中使用 下面是我通过在无服务器
  • 相同的片段、edittext 和 requestfocus 问题

    很抱歉再次就此事寻求帮助 但所有其他帖子都没有帮助 场景如下 我有一个活动 A 其中包含一个布局 其中有一个片段 该片段根据用户输入进行交换 其中一个片段里面有一个编辑文本 我想专注于创建并显示该死的软键盘 因此 在我使用的片段的 onCr
  • PHP:如何将正则表达式转换为示例匹配?

    我有一个用于匹配 URI 的正则表达式 例如 preg match my uri i my uri whatever 我用它来路由 例如 http www mywebsite com my uri page html http www my
  • 在 pandas 中为 python 创建虚拟变量

    我正在尝试使用 python 中的 pandas 从分类变量创建一系列虚拟变量 我遇到过get dummies函数 但每当我尝试调用它时 我都会收到一个错误 指出名称未定义 任何创建虚拟变量的想法或其他方法将不胜感激 EDIT 由于其他人似
  • 将一系列趋势线方程获取到形状文本框

    我试图将图表中第一个系列的趋势线方程获取到工作表上其他位置的形状文本框 但是 只有当我逐行执行代码时 我才能正确填充文本框 在运行时它没有效果 For Each chtObj In ActiveSheet ChartObjects Set
  • 如何获取联系人照片 URI

    我正在与 Android Contact ContentProvider 合作 我有一个电话号码我需要得到URI of the Photo与此电话号码关联的联系人 我该怎么做 我知道我可以得到raw data照片并构建输入流 但我不需要输入
  • 在 jQuery 中向给定日期添加天数[重复]

    这个问题在这里已经有答案了 我有一个包含三个字段的表单 start date days end date 我想通过在开始日期上添加天数来获取结束日期 我的 jQuery 代码是 days change function var start
  • 硬件断点始终为 EXCEPTION_SINGLE_STEP

    我有一个充当调试器的程序 我为线程设置了一个 hw bp 将 dr0 设置为我想要 bp 所在的地址 并将 dr7 设置为 1 因为我希望 bp 在每次执行该地址时生成一个事件 它有效 但现在的问题是我一直没有停止接收 EXCEPTION
  • 当我尝试在 Excel 工作表上运行查询时出现“名称无效括号”错误

    为了制作一些报告 我需要解析一些 Excel 文件 当我尝试从工作表中选择记录时 出现下一个错误 名称 1 的括号无效 页 这是我的代码 OleDbDataAdapter myCommand new OleDbDataAdapter SEL
  • 如何使用泛型来替代一堆处理不同类型的重载方法?

    我有一堆重载方法 它们都获取某种类型的数组作为参数 并从该数组返回一个随机值 function GetRandomValueFromArray Arr array of String String overload begin Result
  • .NET Core - 更改控制器中的依赖关系

    我正在开发一个 Web 应用程序 net core 2 2 并尝试替换控制器中对查询字符串参数的现有依赖项 我知道 可以替换 Startup cs 中的依赖项 ConfigureServices IServiceCollection ser
  • 插入(I,[],[I,[],[]])。如何向二叉树插入一个值?

    要将新元素添加到堆中 我们必须 创建一个包含该元素值的节点 在最后一层的第一个空位置尽可能向左打结 如有必要 创建一个新层 我们总是得到一个完整的二叉树 但不一定是一个堆 我写了这段代码 insert I I insert I G D N