【问题标题】:How do I traverse a tree in Scheme?如何在 Scheme 中遍历树?
【发布时间】:2020-04-04 02:42:07
【问题描述】:

我是方案新手,我正在尝试学习如何遍历 B 树。我仅限于语言中的某些命令,这使得这变得更加复杂。

这是我目前所拥有的:

(define tree'("R" 100 999
(
 ("R" 100 199
      (
       ("L" 120 140 160 180)
      )
  )

 ("R" 200 299
      (
       ("L" 220 240 260 280)
       )
  )
 )))

(define (treeTraversal a)
  (if(equal? (null? a) #t) 0
  (cdr (treeTraversal (cdr a)))))

(treeTraversal tree)

当我通过调试器运行它时,它显示它正在下降列表,首先将第一个“R”剪掉,然后剪掉 100,然后剪掉 999,但从那里列表变为空并在调试器中显示“()”。之后我得到错误:

mcdr:违反合同
预期:mpair?
给定:0

我知道它返回 0 是因为该函数现在看到一个空列表,但我不明白为什么列表变为 null 而不是继续读入嵌套列表。

感谢任何想法和建议。这是我第一次发布问题,所以请耐心等待:)

【问题讨论】:

  • (equal? (null? a) #t) 实际上是(null? a),因为null? 返回一个布尔值。
  • 好点,但我仍然无法通过列表中的前三个项目。我仍然遇到同样的错误。
  • @tjorchrt 我理解你对 b 树的看法,我知道。我想我应该把它放在引号中,因为我并没有真正专注于树的构造,甚至它是一个 b-tree。这项工作的重点是递归的概念,并使用它在树中的一个叶子中找到某个值。我的教授给了我们这棵树作为示例,说明如何使用列表中的列表制作树。因此,尽管您搜索 b-tree 的建议将进一步解释我对它们的了解,但我不确定它是否真的有助于解决我的问题。谢谢你

标签: recursion scheme racket b-tree


【解决方案1】:
(define (treeTraversal a)
  (if (null? a)
      #!null
      (if (pair? a)
          (cons (treeTraversal (car a))
                (treeTraversal (cdr a)))
          a)))

将遍历并复制您的树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多