节点是
(define-struct node (left right))
绿叶二叉树(LBT)是
之一; - 'leaf
; - (make-node LBT LBT)
我必须设计一个接受自然数n的函数,并创建一个高度为n的所有绿叶二叉树的列表。 例如,高度为2应该返回:
`(list
(make-node 'leaf (make-node 'leaf 'leaf))
(make-node (make-node 'leaf 'leaf) 'leaf)
(make-node (make-node 'leaf 'leaf) (make-node 'leaf 'leaf)))`
我已经被困在这项任务上好几天了。我能想到的最好的是:
`(define (lbt-list n)
(cond [(= 0 n) 'leaf]
[(= 1 n) (cons (make-node (lbt-list (- n 1)) (lbt-list (- n 1))) empty)]
[else (list (make-node (first (lbt-list (- n 1))) (lbt-list (- n n)))
(make-node (lbt-list (- n n)) (first (lbt-list (- n 1))))
(make-node (first (lbt-list (- n 1))) (first (lbt-list (- n 1)))))]))`
问题涉及递归,我只是不确定如何完全编码这个函数。任何帮助将不胜感激!
答案 0 :(得分:1)
您正在尝试从列表中创建节点; make-node
唯一有效的参数是leaf
和node
。相反,您应该获取lbt-list
的结果并使用其每个元素来生成列表中的每个node
。
此外,您永远不会使用任何退回的rest
的{{1}}。
答案 1 :(得分:1)
首先,你只获得三棵树的原因是你的else
子句只用list
的三个实例调用make-node
。如果您将(= n 1)
作为基本案例,并在您需要的地方明确使用'leaf
,而不是(lbt-list (- n n))
,则可能会更容易看到。
我认为你会从代码中退一步,并问自己你想要产生什么样的数学产品。特别是,如何从(n-1) -depth二叉树中获取 n -depth二叉树?
将其分为三个部分是最简单的。以下是两个重要提示:
make-node
可交换的吗?最后,辅助函数在这里是你的朋友 - 他们将把生成列表的精神负担分成更小的部分。当我把一个解决方案组合在一起时,我写了三个辅助函数,但是你可以用两个函数来做。