data-structures - 将函数应用于 Racket 中的树结构

标签 data-structures struct tree scheme racket

我正在尝试以 Map 的形式将函数应用于树,但不确定如何具体执行。这是我的尝试..

    (define-struct node (value left middle right)#:transparent)

(struct emptyNode () #:transparent) ; leaf node

(define T (node 1 (node 2 (node 5 (emptyNode) (emptyNode) (emptyNode)) (emptyNode) (emptyNode))
                            (node 3 (emptyNode) (node 6 (emptyNode) (node 8 (emptyNode) (emptyNode) (emptyNode)) (emptyNode)) (emptyNode))
                            (node 4 (emptyNode) (emptyNode) (node 7 (emptyNode) (emptyNode) (emptyNode)))))

;                   1
;                 / |  \
;               2   3   4
;              /    |     \
;             5     6      7
;                   |
;                   8

;f
;   a function, f, used in MaptoTree
(define (f b)
  (* b 2))

;MaptoTree
;    takes a function, f, and a tree structure, tree, as parameters.
;    it should then produce a new tree structure where f has been applied to each value in the original tree
(define (MaptoTree f T)
  (if (pair? T)
      ((map (lambda (x) (MaptoTree f x)) (rest T)))
      (f T)))

编辑:删除了有关将结构转换为列表的问题

最佳答案

您必须使用 node 选择器,而不是 pair?rest 等。我们使用 struct 来表示树,而不是普通的列表。

解决这个问题后,我们只需遍历树,对每个值应用该函数,然后构建一棵新树 - 像这样:

(define (MaptoTree f T)
  (if (emptyNode? T)
      (emptyNode)
      (node (f (node-value T))
            (MaptoTree f (node-left T))
            (MaptoTree f (node-middle T))
            (MaptoTree f (node-right T)))))

关于data-structures - 将函数应用于 Racket 中的树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62108365/

相关文章:

algorithm - 查询数组中的两个整数是否相差D

java集合数据结构

c - 为什么 LLVM IR 结构中的函数指针字段被 {}* 替换?

c - 将结构放入 C 中的数组元素中

c# - 在树中搜索算法

java - 实现树时使用 java.io.Serializable?

algorithm - 从电子商务网站订购的 Top-k 商品

delphi - 存储文件列表信息的数据类型/结构是什么?

c++ - 我可以在不定义构造函数的情况下在堆上创建一个新结构吗?

algorithm - 从中序和后序遍历构造二叉树