球拍:我如何从树中返回符号列表?

时间:2015-01-27 17:15:22

标签: scheme racket

(define-struct sample [color upper lower])

(define v (make-sample 'brown empty empty))
(define w (make-sample 'blue empty empty))
(define x (make-sample 'green v w))
(define y (make-sample 'orange empty empty))
(define z (make-sample 'blue x y))

我试图创建一个函数颜色列表,它采用一个样本并返回其树中所有颜色的符号列表。 例如

;(color-lst z) should return (list 'blue 'green 'brown 'blue 'orange)) 

我将如何做到这一点?

2 个答案:

答案 0 :(得分:1)

为此,您需要使用pre-order traversal遍历树,负责正确创建输出列表。遵循树遍历的标准模板很容易,您只需要知道 where 来调用递归以及放置当前元素的位置。我会给你一些提示,不会破坏达到你自己答案的乐趣。填写空白:

(define (color-lst tree)
  (if (empty? tree) ; if the tree is empty
      <???>         ; it's the base case for building an output list
      (append (cons <???>              ; else add current element
                    (color-lst <???>)) ; recurse on one side
              (color-lst <???>))))     ; and then on the other

如果一切正常,它应该按预期工作:

(color-lst z)
=> '(blue green brown blue orange)

答案 1 :(得分:0)

您可以使用递归函数相当简单地完成此操作。

; sample? -> (listof symbol?)
(define (color-lst sample)
  (cond
    [(sample? sample)
     (cons (sample-color sample)
           (append (color-lst (sample-upper sample))
                   (color-lst (sample-lower sample))))]
    [(empty? sample) sample]
    [else (raise-argument-error 'color-lst "(or/c symbol? null?)" sample)]))

(color-lst z)
; => '(blue green brown blue orange)

这可以通过遍历符号树并构建列表来实现。如果它没有找到其中一个树节点的符号或空列表,它将失败并显示格式错误的错误消息。