Contents    Page-10    Prev    Next    Page+10    Index   

Design Pattern: Binary Tree Recursion

This pattern is like the one for lists, except that it calls itself twice for interior nodes. This is essentially the same as the divide-and-conquer design pattern.

(defun myfun (tree)
         (if (interior? tree)
                 (combine (myfun (left tree))
                         (myfun (right tree)))
                 (if (test tree) ; leaf
                         (baseanswer tree)
                         safeanswer ) ) )

(defun addnums (tree)  ; sum all numbers in tree
  (if (consp tree)
      (+ (addnums (first tree))
         (addnums (rest tree)) )
      (if (numberp tree)
          0) ) )

The safeanswer should be an identity element for the combine operation, i.e. a value that, when combined with any other value, yields the other value.