在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中插入二叉树 的相关文章

  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 包装一个采用 std::function 的函数,以便传递采用更多参数的函数

    Problem 我有一个函数double subs std function
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • typescript 类型最大递归限制为 9

    我终于成功创建了一个通用类型 它为我提供了 json 键列表 值的所有可能组合 我什至准备了一种限制递归的方法 type EditAction
  • 多维数组中的数组排列保留键 PHP

    这两天我一直在疯狂地尝试完成这个任务 也许你可以启发我 这是针对赛马投注排列的 每次用户玩游戏时 我都会得到一个多维数组 2 个级别 第一级包含比赛 ID 第二级包含用户为该比赛选择的马匹 它看起来像这样 play array 4 gt a
  • 在内存有限的二叉树中查找第一个 null

    我有一个二叉树 其中每个节点都可以有一个值 我想找到树中值为空并且最接近根的节点 如果有两个节点到根的距离相同 则任意一个都可以 我需要最小化对二叉树的读取访问次数 假设工作内存仅限于 k 个节点 深度 k 的 DFS 是详尽的 但除非我首
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 如何在 Alloy 中构建递归谓词/函数

    我试图在 Alloy 中生成两组类 例如重构之前的类 重构应用程序后的应用程序和类 假设在第一组中我们有以下类 ALeft gt BLeft gt CLeft Class1 Class2 gt Class3 gt Class4 这意味着 A
  • 如何将嵌套对象数组转换为 CSV?

    我有一个包含嵌套对象的数组 例如 name 1 children name 1 1 children 1 2 id 2 thing name 2 1 children 2 2 name 3 stuff name 3 1 children 3
  • 如何从邻接列表构建嵌套树结构?

    考虑到我有 名为的相邻键 子级 父级 列表A 一个名为Tree存储自己的节点键 整数 和子节点 类 A 61 66 50 61 68 61 33 61 57 66 72 66 37 68 71 33 6 50 11 37 5 37 clas
  • 为什么删除 else 会减慢我的代码速度?

    考虑以下函数 def fact1 n if n lt 2 return 1 else return n fact1 n 1 def fact2 n if n lt 2 return 1 return n fact2 n 1 它们应该是等价的
  • while循环内的递归,它是如何工作的?

    你能告诉我这段java代码是如何工作的吗 public class Main public static void main String args Strangemethod 5 public static void Strangemet
  • 使用线性递归计算第 n 个斐波那契数 [重复]

    这个问题在这里已经有答案了 我努力了二元递归找到第 n 个斐波那契数 或通过使用整个斐波那契数列 for循环进入main 但根据Java 中的数据结构和算法 第六版 迈克尔 T 古德里奇 这是一种效率极低的方法 因为它需要对该方法进行指数级
  • Haskell:处理死锁的自引用列表

    GHC 允许永久阻止以下内容是否有任何有用的理由 list 1 tail list 看起来列表迭代器 生成器有点复杂 我们应该能够做一些更有用的事情 Return error Infinitely blocking list Return
  • Racket 与Scheme 有何不同?

    Racket 是Scheme 的后代 Racket 与 R6RS 有何不同 它添加了什么 删除了什么 或者只是有所不同 我知道 Racket 不仅仅是一种语言 它还是一个语言平台 但我指的是主要的 Racket 方言 Racket 最终基于
  • 一种递归算法,用于在数组中查找总和为给定整数的两个整数

    我需要一个算法来确定数组是否包含两个总和为给定整数的元素 数组已排序 该算法应该是递归的并且运行时间为 O n 递归步骤应该基于总和 这意味着该方法传递总和并根据最终结果返回 true 或 false 如果找到两个元素 返回 true 否则
  • 正则表达式引擎如何解析具有递归子模式的正则表达式?

    此正则表达式匹配回文 1 2 我无法理解它是如何工作的 递归何时结束 以及正则表达式何时从递归子模式中断并转到 part Thanks 编辑 抱歉我没有解释 2 and 1 1 指第一个子模式 对其自身 2 反向引用第二个子模式的匹配 即
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 求 3D 棋盘中水体积的技巧

    所以我有一个任务 我必须重新创建一个 3D 棋盘 它是一个 RxC 方块网格 每个方块的高度都不同 如果棋盘是不透水的 有人把水倒在棋盘上 直到棋盘无法容纳更多的水 那么它就会容纳固定数量的水 如果板已经容纳了最大体积的水 则倒入板上的任何

随机推荐

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

    我使用 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