Square-tree using maps and recursion Define a procedure square-tree analogous to the
  square-list procedure of exercise
  2.21. That is, square-list should behave as follows:

(square-tree  (list 1
        (list 2 (list 3 4) 5)
        (list 6 7))) (1 (4 (9 16) 25) (36 49))

  
  Define square-tree both directly
  (i.e., without using any higher-order
  procedures) and also by using map and
  recursion.


I wrote this solution.  What do you think?

(define (square x) (* x x))

(define (square-tree tree)
  (cond ((null? tree) null)
        ((pair? tree)
         (cons (square-tree (car tree)) 
               (square-tree (cdr tree))))
        (else (square tree))))

(define (map-square-tree tree)
  (map (lambda (subtree)
         (if (pair? subtree)
             (cons (square-tree (car subtree))
                   (square-tree (cdr subtree)))
             (square subtree)))
       tree))

(define a (list 1 1 (list (list 2 3) 1 2)))


EDIT: This is a much better solution for map-square-tree.

(define (square x) (* x x))

(define (square-tree tree)
  (cond ((null? tree) null)
        ((pair? tree)
         (cons (square-tree (car tree)) 
               (square-tree (cdr tree))))
        (else (square tree))))

(define (map-square-tree tree)
  (map (lambda (subtree)
         ((if (pair? subtree) map-square-tree square) subtree))
       tree))

(define a (list 1 1 (list (list 2 3) 1 2)))
Your direct definition of square-tree is correct.

Your definition using map calls square-tree; to make it properly recursive, call map-square-tree instead.  Further, you may recurse on the subtree itself.  This will make your code succinct.

(define (map-square-tree tree)
  (map (lambda (subtree)
         ((if (pair? subtree) map-square-tree square) subtree))
       tree))