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) 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.