Merge branch 'master' of github.com:froydnj/trees
[trees.git] / print.lisp
1 (in-package :trees)
2
3 (defmethod print-object ((node tree-node) stream)
4   (print-unreadable-object (node stream)
5     (format stream "btn ~A, rank ~A"
6             (datum node)
7             (rank node))))
8
9 (defmethod print-object ((node avl-tree-node) stream)
10   (print-unreadable-object (node stream)
11     (format stream "avltn ~A/~A, rank ~A"
12             (balance-info node)
13             (datum node)
14             (rank node))))
15
16 (defmethod print-object ((node red-black-tree-node) stream)
17   (print-unreadable-object (node stream)
18     (format stream "rbtn ~A/~A, rank ~A"
19             (color node)
20             (datum node)
21             (rank node))))
22
23 (defmethod print-object ((node aa-tree-node) stream)
24   (print-unreadable-object (node stream)
25     (format stream "aatn ~A/~A, rank ~A"
26             (level node)
27             (datum node)
28             (rank node))))
29
30 (defun indent-to-level (n &optional (stream *standard-output*))
31   (dotimes (i n)
32     (write-char #\Space stream)))
33
34 (defun pprint-tree (tree &optional (stream *standard-output*))
35   (labels ((recursive-print (node level char)
36              (indent-to-level level stream)
37              (write-char char stream)
38              (write-char #\Space stream)
39              (prin1 node stream)
40              (terpri stream)
41              (unless (null (left node))
42                (recursive-print (left node) (1+ level) #\l))
43              (unless (null (right node))
44                (recursive-print (right node) (1+ level) #\r))))
45     (if (null (root tree))
46         (format stream "empty tree~%")
47         (recursive-print (root tree) 0 #\R))
48     (values)))