在Scheme中插入二叉树

2024-03-30

我想知道如何将列表中的元素插入二叉搜索树。我想知道为什么下面的代码不能按我的预期工作。输出是'((4 1 5 13 6) () ())我的下一个问题是对列表中的元素进行排序,但现在我只想插入它们。

我的输出对于我所说的问题是否正确?我的代码如下:

( define ( make-tree value left right ) 
( list value left right ))
( define ( value tree ) ( car tree ))
( define ( left tree ) ( cadr tree ))
( define ( right tree ) ( caddr tree ))

(define (insert-list L T)
 (cond ((null? T) (make-tree L '() '()))
    ((= (car L) (value T)) T)
    ((< (car L) (value T)) (make-tree (value T)
                                      (insert-list (car L) (left T))
                                      (right T)))
    ((> (car L) (value T)) (make-tree (value T)
                                      (left T)
                                      (insert-list (car L) (right T))))))

这段代码的问题

在编写递归代码时,通常最好考虑函数应该采用什么作为参数,应该返回什么,以及基本情况是什么。

(define (insert-list L T)
 (cond
    ((null? T) (make-tree L '() '()))                                     ; case 1
    ((= (car L) (value T)) T)                                             ; case 2
    ((< (car L) (value T)) (make-tree (value T)                           ; case 3
                                      (insert-list (car L) (left T))
                                      (right T)))
    ((> (car L) (value T)) (make-tree (value T)                           ; case 4
                                      (left T)
                                      (insert-list (car L) (right T))))))

根据你的描述,insert-list应该获取一个元素列表和一棵树,并返回通过将这些元素一个接一个地插入到树中而获得的树。这段代码真的能做到这一点吗?有以下几种情况:

  1. 当树为空时,您确实需要创建一个包含某些元素的新树,但您的第一个情况创建一个包含以下元素的树:wholelist 作为其元素,并返回 this。这就是为什么你会得到这样的结果((4 1 5 13 6) () ())。你到达了这个基本情况并返回了结果(make-tree L '() '())).
  2. 当。。。的时候first列表的元素是树的值,那么您返回树是正确的,因为您不需要执行任何其他操作来插入该树first列表的元素。但随后您无需对其余元素执行任何其他操作。这没有任何好处。如果你有一个像这样的测试用例(insert-list '(2 3 4) '(2 () ())),你会看到返回值是(2 () ()).
  3. (和 4.)在这些情况下,您可以进行递归调用,例如(insert-list (car L) (left T)),但这没有意义,因为第一个参数insert-list应该是一个元素列表,你用它来调用它(car L)这是一个单一的元素。不过,你认识到这一点是对的(car L)需要插入到树的左子树中,并且只要您调用,您就可以正确构建它(insert-element (car L) (left T)), 反而。但是,您仍然没有对rest之后的元素。

折叠来救援!

如果您尝试获取数字列表并插入first将一个数字放入一棵树中以获得一棵新树,然后将第二个数字插入该树中,依此类推,您正在寻找类似以下伪代码的内容:

tree = initial-tree
for element in list 
  tree = insert(element,tree)
return tree

这种操作通常用功能表示fold。我在回答中详细描述了折叠展平列表列表 https://stackoverflow.com/q/19229444/1281433,并且有很多关于它们的信息。这个想法是你想把类似的东西变成

(insert-list '(4 1 5 13 6) '())

into

(tree-insert (tree-insert (tree-insert (tree-insert (tree-insert '() 4) 1) 5) 13) 6)

那是一个左结合折叠。让我们使用这个定义foldl:

(define (foldl fn init list)
  (if (null? list)
      init
      (foldl fn (fn init (car list)) (cdr list))))

在这种特殊情况下,您需要实施正常的tree-insert接受一棵树和一个元素 a 的函数返回一棵新树,然后是要插入的函数all列表中的元素很简单

(lambda (tree elements)
  (foldl tree-insert tree elements))

例如,

> (foldl tree-insert '() '(3 5 8 1 9))
(3 (1 () ()) (5 () (8 () (9 () ()))))
> (foldl tree-insert '() '(5 8 2 3 1 6 9))
(5 (2 (1 () ()) (3 () ())) (8 (6 () ()) (9 () ())))
> (foldl tree-insert '() '(4 1 5 13 6))             ; the test from the question
(4 (1 () ()) (5 () (13 (6 () ()) ())))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Scheme中插入二叉树 的相关文章

  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • 第99章 啤酒瓶递归好像不行

    好的 这是我在学习过程中编写的简单代码 void SingTheSong int NumOfBottles if NumOfBottles 0 printf there are simply no more bottles of beer
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看
  • 在Racket中将结构递归转化为累积递归

    我有一些代码来查找最大高度并将其替换为关联的名称 身高和姓名有单独的列表 每个列表的长度相同且非空 我可以使用结构递归来解决这个问题 但必须将其更改为累积递归 而且我不确定如何做到这一点 我见过的所有例子都让我困惑 有人能够将代码变成使用累
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 迭代函数可以调用自身吗?

    当观看下面的 MIT 6 001 课程视频时 讲师在 28 00 将此算法标记为迭代 但是 在 30 27 他说这个算法和实际的 递归 算法都是递归的 该函数正在使用基本情况调用自身 那么这次迭代情况如何 private int itera
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • 我在函数的最后一次递归调用中得到“方案应用程序而不是过程”

    所以这是代码 define time prime test n newline display n start prime test n runtime define start prime test n start time if pri
  • Python如何处理无限递归?

    因此 在使用 Python 时 我注意到程序的堆栈大小基本上没有限制 继续对数字执行幂运算 即使在达到数千位之后 精度仍然保持完美 这让我想知道 如果我不小心进入了Python的无限递归循环怎么办 编译器会注意到并抛出堆栈溢出错误吗 或者程
  • 理解基本递归

    public static void main String args System out println factorial 5 public int factorial int n if n lt 1 return 1 else re
  • php递归合并

    我需要以某种不同的方式合并一些数组 我使用 array merge recursive 然而 有一些事情我需要改变 但我不知道如何改变 这是来自 php net 的引用 但是 如果数组具有相同的数字键 则后面的值 不会覆盖原始值 但会追加
  • 卷积函数可以写成尾递归形式吗?

    我有一个函数 我想以尾递归形式编写 该函数计算求和的方法数k通过滚动s双面模具n次 我已经在上面看到了这个函数的数学解这个答案 https math stackexchange com questions 397689 why convol
  • 函数速度测试的奇怪结果

    我编写了一个使用递归来查找最大公因数 分母 的函数 gt gcd function a b if length a length b gt 1 warning Only scalars allowed using first element
  • 可扩展的宏定义

    灵感来自于评论区 https stackoverflow com questions 23879410 is it possible to extend a function lambda macro in scheme 23879575
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • 递归分割列表函数 LISP

    split list 函数接受一个列表并返回一个由两个列表组成的列表 其中两个列表由输入的交替元素组成 我写了以下内容 defun split list L cond endp L list NIL NIL t let X split li
  • 如何在mit-scheme中正确使用(读取)?

    我在文档和 Rosetta 代码中读到 read 用于从控制台获取输入 所以我写了这段代码来检查这一点 display read 1 但 mit scheme 从不要求用户输入 程序就会终止 为什么会这样呢 在 REPL 中 display

随机推荐

  • 如何用反应钩子停止负数?

    我使用 React Hook 来增加和减少数字 但是当减少到0以下然后计算负值时我遇到了一个问题 我不想要负值 如何使用react hook停止负值 我已经尝试过这段代码 import React useState useEffect fr
  • 设置 DateTimePicker 的绑定值

    我有一个名为 Employee 的 EF 实体 它有一个可为空的 DateTime 属性 TerminationDate DisplayName Termination Date DisplayFormat ApplyFormatInEdi
  • 访问 VBA OpenForm 分组和排序

    我有一个用于数据输入的表格 我们必须返回并添加数据到这些记录中 有没有办法拉出按字段 A 对记录进行分组并按字段 B 排序的表单 这本质上会对表格 A1 1 A1 2 等进行排序 从而使添加数据变得更加容易 现在我使用 DoCmd Open
  • 服务器端处理 JWT 令牌的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 产生自这个线程 https stackoverflow com questions 30494383 using jwt with active
  • WPF 列表框 IndexFromPoint

    我正在 WPF ListBoxes 之间执行拖放操作 我希望能够将其插入到集合中被拖放的位置而不是列表末尾 有谁知道类似于 WinForms ListBox IndexFromPoint 函数的解决方案 我最终通过使用 DragDropEv
  • 处理 Reactor 中的并联通量

    我已经从 iterable 创建了一个并行通量 对于每个可迭代 我都必须进行休息调用 但是在执行时 即使任何一个请求失败 所有剩余的请求也会失败 我希望所有的请求都能被执行 无论失败或成功 我目前正在使用 Flux fromIterable
  • Html.Partial 不渲染部分视图

    我在视图中有以下代码 if SiteSession SubPageHelper DisplayType DisplayType List Html Partial SubLandingPage List else Html Partial
  • 可达性未按预期工作

    从 Apple 下载了 Reachability 使用此方法检查活动连接 BOOL isReachable Reachability r Reachability reachabilityWithHostName http www goog
  • LinkedIn 身份验证和聚合数据

    我正在使用 Ruby on Rails 构建一个 Web 应用程序 我希望我的用户能够验证和聚合来自 Linked In 以及其他类似 Github Twitter 等 的数据 我正在使用这些宝石 设计注册 用于身份验证的omniauth
  • Android:更改按钮的父视图

    我有一个RelativeLayout 里面有一个按钮 一旦用户单击该按钮 我想更改父视图 RelativeLayout 的背景 我知道我可以通过将父视图存储在变量中或在按钮上设置标签来做到这一点 但我会避免这种情况 我有充分的理由不希望这样
  • 动画 SVG 虚线

    我想制作一个动画虚线在 SVG 文件中 该线应该从 0 长度 增长 到全长 我发现的所有方法都不适合我 有谁有想法 如何解决这个问题 这是我的 svg 文件中的路径
  • ASP.NET MVC Razor 视图中的 Html.Raw()

    int count 0 foreach var item in Model Resources count lt 3 Html Raw div class ToString Html Raw some code count lt 3 Htm
  • 如何恢复 XGBoost 特征重要性图中的原始特征名称(预处理删除它们后)?

    在训练 XGBoost 模型之前对训练数据进行预处理 例如居中或缩放 可能会导致特征名称丢失 SO 上的大多数答案建议以不会丢失特征名称的方式训练模型 例如在数据框列上使用 pd get dummies 我使用预处理数据训练了 XGBoos
  • 你能在 TypeScript 中指定对象字面量的类型吗?

    我想知道是否有一种方法可以指定对象文字的类型 例如 如何解析此代码并分配一个B字面意思是A多变的 interface A a string interface B extends A b string const a A a b B is
  • P/Invoke 是否执行 DLL 然后将其关闭?

    如果我使用 C P Invoke 某个 DLL 实际的 C DLL 是否会在调用期间运行 然后关闭 从而销毁所有已使用的内存 或者 NET 是否会在非托管 堆 中负责 C DLL 使用的内存 并在每次调用静态函数时将指向这些对象的指针提供给
  • 将函数应用于两个列表?

    为了找到两个矩阵 X 和 Y 的行相关性 输出应该具有 X 的第 1 行和 Y 的第 1 行的相关值 因此总共有 10 个值 因为有 10 行 X lt matrix rnorm 2000 nrow 10 Y lt matrix rnorm
  • 如何使用 Play Framework 2.2.x 导入 build.sbt 中的模板

    我必须在所有模板中导入一些可重用的块 我已经定义了一个块app views blocks header scala html 将该块包含在我的所有模板中 如所述here http www playframework com document
  • 是否有一个库类来表示浮点数?

    我正在编写一个应用程序 它可以进行大量操作decimal数字 例如 57 65 由于乘法和除法很快会侵蚀它们的准确性 我想将数字存储在一个类中 以便在操作后保留它们的准确性 而不是依赖于 float 和 double 我正在谈论这样的事情
  • 在 Python 中转储到 JSON 时,字符串中的 Unicode 值会被转义 [重复]

    这个问题在这里已经有答案了 例如 gt gt gt print json dumps r e r u016f u017ee 当然 在实际的程序中它不仅仅是一个字符串 在文件中也是这样出现的 当使用json dump 我也希望它简单地输出 r
  • 在Scheme中插入二叉树

    我想知道如何将列表中的元素插入二叉搜索树 我想知道为什么下面的代码不能按我的预期工作 输出是 4 1 5 13 6 我的下一个问题是对列表中的元素进行排序 但现在我只想插入它们 我的输出对于我所说的问题是否正确 我的代码如下 define