(in-package :binary-trees) (defmethod print-object ((node binary-tree-node) stream) (print-unreadable-object (node stream) (format stream "btn ~A, rank ~A" (if (slot-boundp node 'datum) (datum node) "Sentinel") (rank node)))) (defmethod print-object ((node avl-tree-node) stream) (print-unreadable-object (node stream) (format stream "avltn ~A/~A, rank ~A" (balance-info node) (if (slot-boundp node 'datum) (datum node) "Sentinel") (rank node)))) (defmethod print-object ((node red-black-tree-node) stream) (print-unreadable-object (node stream) (format stream "rbtn ~A/~A, rank ~A" (color node) (if (slot-boundp node 'datum) (datum node) "Sentinel") (rank node)))) (defmethod print-object ((node aa-tree-node) stream) (print-unreadable-object (node stream) (format stream "aatn ~A/~A, rank ~A" (level node) (if (slot-boundp node 'datum) (datum node) "Sentinel") (rank node)))) (defun indent-to-level (n &optional (stream *standard-output*)) (dotimes (i n) (write-char #\Space stream))) (defun pprint-tree (tree &optional (stream *standard-output*)) (labels ((recursive-print (node level char) (indent-to-level level stream) (write-char char stream) (write-char #\Space stream) (prin1 node stream) (terpri stream) (unless (null-node-p (left node) tree) (recursive-print (left node) (1+ level) #\l)) (unless (null-node-p (right node) tree) (recursive-print (right node) (1+ level) #\r)))) (recursive-print (root-node tree) 0 #\R) (values)))