你如何在计划中总结树

时间:2014-11-24 00:43:35

标签: scheme racket

;; A [BT X] is one of 
;; - 'leaf
;; - (make-node X [BT X] [BT X])


(define-struct node (val left right))
;; interpretation: represents a node with a value
;; a left and right subtree

(define (tree-sum tree)
   (cond 
      [(symbol=? tree 'leaf) ...] ;; the value remains same 
      [(node? tree)
            (+ (tree-sum (node-val tree))
               (tree-sum (node-left tree))
               (tree-sum (node-right tree)))]))

不太确定我是否在正确的轨道上。

通常,对树是

  • 一片叶子(不是一对)或
  • 一对,其汽车和cdr值是双树。

递归求和程序必须处理这两种情况:

  • 数字,即数字树的叶子,和
  • 对,在这种情况下,它应该对左右子树求和,并将这些和加在一起。

因此,

(define (pair-tree-sum pair-tree)
    (cond 
       [(number? pair-tree)
             pair-tree]
       [else
             (+ (pair-tree-sum (car pair-tree))
                (pair-tree-sum (cdr pair-tree)))]))

1 个答案:

答案 0 :(得分:1)

您可以将该功能分为两部分 - 一部分将树转换为数字列表,另一部分将foldl与该列表一起使用,foldl具有自动执行总和作为累加器。

(define (tree->list tree)
  (if (pair? tree)
      (append (tree->list (car tree))
              (tree->list (cdr tree)))
      (list tree)))

(define (tree-sum tree)
  (foldl + 0 (tree->list tree)))