【问题标题】:Binary trees in scheme方案中的二叉树
【发布时间】:2013-11-15 04:10:04
【问题描述】:

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

;;; 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,我应该在虚线中添加什么类型的函数?

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

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

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

    正如我在问题中看到的那样,您的基本情况是正确的。递归案例很简单!请记住,当我们添加列表中的元素时,我们是如何组合结果的?这里是一样的,只是我们结合了左子树和右子树的结果。

    【讨论】:

    • 所以只是加号?世间如何。如果您想将所有节点添加在一起,您不会使用加号吗?哇!
    • @Josh 这是递归的魔力:每次你调用how-many?,你都会得到树的那个部分的节点数——无论是左边还是右边。要获得整棵树的总和,只需将左侧的结果加上右侧的结果相加即可
    • 现在非常有意义。谢谢。
    • @Josh 总是问自己一个问题:我如何合并结果?第一个元素和其余元素的结果(在列表的情况下)。或者当前节点、左子树和右子树的结果(在树的情况下)。在这个特定的树中更简单,因为只有树的叶子包含数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多