计划中的二进制树

时间:2013-11-14 19:49:33

标签: scheme racket

我如何计算树有多少个节点?

;;; A Binary is one of:
;;; - Number
;;; - (make-node BT BT)


(define-struct node (left right))

(define tree1 (make-node (make-node 10 9)
(make-node 3
(make-node 1 5))))

(define (how-many? nd)
  (cond
    [(number? nd)....]
    [(node? n)
     (..... (how-many? (node-left nd))
             (how-many? (node-right nd)))]))

所以对于tree1我应该

 (check-expect (how-many? tree1) 5)

我认为我的模板正确。如果是数字,则应返回1。但如果它是node,我应该在虚线中放入什么类型的函数?

1 个答案:

答案 0 :(得分:4)

这有点类似于处理列表的方式。区别?现在你将转到每个节点的“左”和“右”,而不是仅仅去“休息”。除此之外,同样的想法适用:

(define (how-many? nd)
  (cond
    [(number? nd) <???>] ; if it's a leaf, then how many numbers does it have?
    [(node? nd)
     (<???> (how-many? (node-left nd)) ; how do we combine the results?
            (how-many? (node-right nd)))]))

正如我在问题中所看到的那样,你得到了基本案例。递归案例很简单!记住,当我们添加列表中的元素时,我们如何结合结果?这是同样的事情,只是我们结合了左边和右边子树的结果。