(set the-empty-tree '(tree))

(define tree-make (left node right)
   ; : tree, s-exp, tree -> tree
  (cons 'tree
    (cons left
          (cons node (cons right '())))))

(define leaf-make (node)
  ; : s-exp -> tree
  (tree-make
    the-empty-tree node the-empty-tree))

(define post-order2 (tree)
  (if (null? (cdr tree)) '()
    (append (post-order2 (cadr tree))
            (append
              (post-order2
		(caddr tree))
                (cons
		  (caddr (cdr tree))
		  '())))))

(define tree-empty? (tree)
  (null? (cdr tree)))
(define tree-left (tree)
  (car (cdr tree)))
(define tree-root (tree)
  (cadr (cdr tree)))
(define tree-right (tree)
  (caddr (cdr tree)))

(define append3 (l1 l2 l3)
  (append l1 (append l2 l3)))

(define post-order (tree)
  (if (tree-empty? tree) '()
    (append3
      (post-order (tree-left tree))
      (post-order (tree-right tree))
      (list1 (tree-root tree)))))

(set the-empty-tree '())

(define tree-make (left node right)
   ; : tree, s-exp, tree -> tree
   (cons left
         (cons node (cons right '()))))

(define leaf-make (node)
  ; : s-exp -> tree
  (tree-make
    the-empty-tree node the-empty-tree))

(define tree-empty? (tree)
  (null? tree))
(define tree-left (tree)
  (car tree))
(define tree-root (tree)
  (cadr tree))
(define tree-right (tree)
  (caddr tree))

(cluster Tree
  ; Export: make, empty, empty?,
  ; left, right, root

  (rep lst)
  ; if lst is empty, tree is empty
  ; else (List$car lst) is left subtree,
  ; (List$car (List$cdr lst)) is root,
  ; (List$car (List$cdr (List$cdr lst)))
  ; is right subtree

  (define empty ()
    ; -> Tree
    (Tree (List$nil)))

  (define make (left node right)
    ; : Tree, object, Tree -> Tree
    (Tree
     (List$cons left
      (List$cons node
       (List$cons right (List$nil))))))

  (define empty? (tree)
    (List$null? (lst tree)))

  (define left (tree)
   (List$car (lst tree)))
  (define root (tree)
   (List$car (List$cdr (lst tree))))
  (define right (tree)
   (List$car (List$cdr
     (List$cdr (lst tree)))))
)

(define leaf-make (node)
  ; : Object -> Tree
  (tree$make
    (Tree$empty) node (Tree$empty)))

(load libraray.clu)

(define append (x y)
  (if (List$null? x) y
    (List$cons (List$car x)
               (append (List$cdr x) y))))

(define append3 (l1 l2 l3)
  (append l1 (append l2 l3)))

(define post-order (tree)
  (if (Tree$empty? tree) (List$nil)
    (append3
      (post-order (Tree$left tree))
      (post-order (Tree$right tree))
      (list1 (Tree$root tree)))))

(cluster Tree
  ; Export: make, empty, empty?,
  ; left, right, root

  (rep defined l n r)
  ; if defined = 0, tree is empty
  ; otw, defined = 1 and l is left subtree
  ; n is value of the root node,
  ; r is right subtree

  (define empty ()
    ; -> Tree
    (Tree 0 0 0 0))

  (define make (left node right)
    ; : Tree, object, Tree -> Tree
    (Tree 1 left node right))

  (define empty? (tree)
    (= 0 (defined tree)))

  (define left (tree)
   (l tree))
  (define root (tree)
   (n tree))
  (define right (tree)
   (r tree))
)

