```#-(and) "

P56 (**) Symmetric binary trees

Let us call a binary tree symmetric if you can draw a vertical
line through the root node and then the right subtree is the
mirror image of the left subtree. Write a predicate symmetric/1 to
check whether a given binary tree is symmetric. Hint: Write a
predicate mirror/2 first to check whether one tree is the mirror
image of another. We are only interested in the structure, not in
the contents of the nodes.

"

;; Solution:

(defun binary-tree-mirror-p (left right)
(or (and (binary-tree-empty-p left)
(binary-tree-empty-p right))
(and (not (binary-tree-empty-p left))
(not (binary-tree-empty-p right))
(binary-tree-mirror-p (binary-tree-left  left)
(binary-tree-right right))
(binary-tree-mirror-p (binary-tree-right left)
(binary-tree-left  right)))))

(defun binary-tree-symetric-p (node)
(binary-tree-mirror-p (binary-tree-left  node)
(binary-tree-right node)))

;; (binary-tree-symetric-p (binary-tree-from-sexp '(x
;;                                                  (x (x nil nil) nil)
;;                                                  (x nil (x nil nil)))))
;; --> T
;;
;; (binary-tree-symetric-p (binary-tree-from-sexp '(x
;;                                                  (x (x nil nil) nil)
;;                                                  (x (x nil nil) nil))))
;; --> NIL

;;;; THE END ;;;;```
ViewGit