DrRacket-更新二叉树中的值

DrRacket-更新二叉树中的值,racket,Racket,我正在编写一个函数,它将生成一个新版本的二叉树bt,其中每个节点的值都是奇数长度字符串,其值将替换为字符串“奇数”。 例如: (check-expect (odd-length (make-node 4 "four" (make-node 7 "seven" empty

我正在编写一个函数,它将生成一个新版本的二叉树
bt
,其中每个节点的值都是奇数长度字符串,其值将替换为字符串“奇数”。 例如:

(check-expect (odd-length (make-node 4 "four"
                                     (make-node 7 "seven"
                                                empty
                                                (make-node 2 "two" empty empty))
                                     (make-node 32 "thirty-two" empty empty)))
              (make-node 4 "four"
                                     (make-node 7 "odd"
                                                empty
                                                (make-node 2 "odd" empty empty))
                                     (make-node 32 "thirty-two" empty empty))

我已经成功地编写了一个转换单个值的函数,但我不知道如何使它适用于二叉树中的所有节点。有人能帮忙吗?非常感谢>我们可以简单地在树上定义一个
map
,并将
change str
作为
val
s的函数传递

(define (odd-length tree)
  (tree-map identity change-str tree))

(define (change-str str)
  (if (odd? (string-length str)) "odd" str))

(define (tree-map func-key func-val tree)
  (cond [(empty? tree) tree]
        [else (make-node (func-key (node-key tree))
                         (func-val (node-val tree))
                         (tree-map func-key func-val (node-left tree))
                         (tree-map func-key func-val  (node-right tree)))]))

您需要在左侧和右侧递归调用它
(define (odd-length tree)
  (tree-map identity change-str tree))

(define (change-str str)
  (if (odd? (string-length str)) "odd" str))

(define (tree-map func-key func-val tree)
  (cond [(empty? tree) tree]
        [else (make-node (func-key (node-key tree))
                         (func-val (node-val tree))
                         (tree-map func-key func-val (node-left tree))
                         (tree-map func-key func-val  (node-right tree)))]))