创建最大高度为n的二叉树列表

时间:2015-11-13 00:31:40

标签: recursion binary-tree racket

节点是

(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)))))]))`

问题涉及递归,我只是不确定如何完全编码这个函数。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您正在尝试从列表中创建节点; make-node唯一有效的参数是leafnode。相反,您应该获取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可交换的吗?
  • 笛卡儿产品相关的级别生成如何

最后,辅助函数在这里是你的朋友 - 他们将把生成列表的精神负担分成更小的部分。当我把一个解决方案组合在一起时,我写了三个辅助函数,但是你可以用两个函数来做。