(define (make-expr left-op operator right-op)
(list left-op operator right-op))
(define (operator expr-tree)
(car (cdr expr-tree)))
(define (left-op expr-tree)
(car expr-tree))
(define (right-op expr-tree)
(car (cdr (cdr expr-tree))))
(define (preorder expr-tree)
(cond ((pair? expr-tree) (append (list (operator expr-tree)) (preorder
(left-op expr-tree)) (preorder (right-op expr-tree))))
(else (list expr-tree))))
(define (postorder expr-tree)
(cond ((pair? expr-tree) (append (postorder (left-op expr-tree)) (post
order (right-op expr-tree)) (list (operator expr-tree))))
(else (list expr-tree))))
(define (inorder expr-tree)
(cond ((pair? expr-tree) (append (inorder (left-op expr-tree)) (list (
operator expr-tree)) (inorder (right-op expr-tree))))
(else (list expr-tree))))
;; without using a helper function
(define (eval-expr expr-tree)
(cond ((pair? expr-tree)
((cond ((equal? (operator expr-tree) '+) +)
((equal? (operator expr-tree) '-) -)
((equal? (operator expr-tree) '*) *)
((equal? (operator expr-tree) '/) /)) (eval-expr (left-op expr-tree)) (eval-expr (right-op expr-tree))))
(else expr-tree)))
;; using a helper function for getting the operator
(define (eval-expr expr-tree)
(cond ((pair? expr-tree)
((look-up-op (operator expr-tree)) (eval-expr (left-op expr-tree)) (eval-expr (right-op expr-tree))))
(else expr-tree)))
(define (look-up-op op)
(cond ((equal? op '+) +)
((equal? op '-) -)
((equal? op '*) *)
((equal? op '/) /)))