方案改变树值

时间:2018-04-24 10:04:15

标签: tree scheme racket

我需要实现一个名为inverse-tree的过程来接收树 其节点数据值是数字和布尔值并返回等价​​物 节点满足以下条件的树:

  • 如果原始树的等效节点是数字,则结果树的节点为-1·节点值
  • 如果原始树的等效节点是布尔值,则结果树的节点不是该节点值的逻辑

示例:

> (inverse-tree ’())
’()
> (inverse-tree ’(5))
’(-5)
> (inverse-tree ’(0))
’(0)
> (inverse-tree ’(#f))
’(#t)
> (inverse-tree ’(#t))
’(#f)
> (inverse-tree ’(-5 (1 (-2) (3) (#f)) (#t)))
’(5 (-1 (2) (-3) (#t)) (#f))

Scheme中(可能为空或非完整)树的表示如下:每个嵌套级别中的第一个元素表示子树的根。其余的元素是孩子(当然,每个孩子都是树)。叶子由仅包含一个元素的列表(叶子值)表示。一个完全空的树由空列表表示。

Scheme altering tree values的更多信息。

4 个答案:

答案 0 :(得分:2)

记下可能的输入(在树的描述中有三种情况)并为每种情况定义结果。

以下是您需要实现的常规树遍历:

  • 如果树是空的:
    • 制作空树
  • 如果树是叶子:
    • 生产倒叶
  • 否则:
    • 反转节点的值
    • 通过将此反转值与反转每个子树的结果相结合来生成新树

您可能希望在自己喜欢的Scheme书中阅读map

有可能(但我怀疑这是后来的练习)来概括这一点,以便它在树中应用任意函数,就像map对列表一样。

答案 1 :(得分:1)

树结构的解释似乎不起作用。 (1 (-2) (3)是一个节点,但1不是父节点。但是,您似乎可以将整个事物看作二叉树,其中对是节点,空列表是空树,任何其他值都是叶节点。

抽象看起来像这样:

(define make-tree cons)
(define tree-left car)
(define tree-right cdr)
(define tree? pair?)
(define empty-tree '())

您可以映射树的值,如下所示:

(define (map-tree proc tree)
  (cond ((eq? empty-tree tree) empty-tree)
        ((tree? tree) 
         (make-tree (map-tree proc (tree-left tree))
                    (map-tree proc (tree-right tree))))
        (else (proc tree))))

示例:

(map-tree (lambda (v) (+ v 1)) '(1 (2) 3))
; ==> (2 (3) 4)

显然,您需要使用如下所示的过程替换第一个参数:

(inverse #f) ; ==> #t
(inverse #t) ; ==> #f
(inverse 5)  ; ==> -5
;; optional
(inverse 'xxx) ; ==> xxx

然后,您可以轻松完成手术:

(define (inverse-tree tree)
  (map-tree inverse tree))

(inverse-tree ’(-5 (1 (-2) (3) (#f)) (#t)))
; ==> (5 (-1 (2) (-3) (#t)) (#f))

现在,如果您不能使用抽象,则需要使用替换规则。例如。

(define (tree-inc v)
  (map-tree (lambda (v) (+ v 1)) v))

; ==
(define (tree-inc tree)
  (cond ((eq? '() tree) '())
        ...
        (else (+ (car tree) 1))))

你有它。比使用抽象的更难以阅读和推理。祝你好运。

答案 2 :(得分:1)

经过大量挖掘和理解语法后,我提出了一个简单的1函数解决方案:

(define (inverse-tree tree)
  (cond ((eq? '() tree) '())
        ((pair? tree) 
         (cons (inverse-tree (car tree))
                    (inverse-tree (cdr tree))))
        (else ((lambda(x) (if (boolean? x) (not x) (- x))) tree))))

答案 3 :(得分:1)

我认为应该有效:

  (define inverse-tree
  (lambda (tree)
    (if (null? tree)
        '()
        (if (number? (car tree))
            (cons (* -1 (car tree)) (inverse-tree (cdr tree)))
            (if (boolean? (car tree))
                (cons (not (car tree)) (inverse-tree (cdr tree)))
                (cons (inverse-tree (car tree)) (inverse-tree (cdr tree))))))))