【发布时间】:2020-03-13 04:11:52
【问题描述】:
我正在尝试使用 Racket 的#plai 语言定义一棵树,但在通过“添加节点”函数创建树时我有点挣扎。
我使用的定义类型是这样的:
(define-type BBT
[empty]
[leaf (elem number?)]
[node (elem number?) (left BBT?) (right BBT?)])
我想构建一棵如下所示的树:
(node 3 (empty) (node 5 (leaf 4) (leaf 6)))
在这个电话之后:
(add-node 6 (add-node 4 (add-node 5 (add-node 3 (empty)))))
到目前为止,我已经尝试了以下方法:
(define (add-node n tree)
(match tree
[(empty) (node n (empty) (empty))]))
这适用于一棵空树,因为它只是在两侧添加了一个带有空树的节点,但我还没有找到一种方法来构建像我上面分享的示例那样的树。
关于我应该做什么的任何提示或建议?我知道当它捕获“节点”情况时我应该使用递归,但到目前为止我还没有想出成功的尝试。
谢谢!
【问题讨论】:
-
在不引入诸如晦涩难懂的球拍语言之类的复杂事物的情况下,您是否了解它的工作原理?这个问题是关于递归还是球拍?
-
您的
add-node严重不足:它添加了新的右分支、左分支还是什么?它是添加叶子的节点吗?它是否构造了一棵以现有树为分支之一的新树?如果有,是哪个分支?另一个分支是什么?