-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtree-visualizer.rkt
63 lines (54 loc) · 1.84 KB
/
tree-visualizer.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#lang racket
(require pict/tree-layout)
(require pict)
(provide visualize)
(define (binary->layout tree)
(cond
[(empty? tree) (tree-layout #:pict (blank))]
[else (define v (struct->vector tree))
(define key (vector-ref v 1))
(define left (vector-ref v 2))
(define right (vector-ref v 3))
(tree-layout #:pict (text (~v key) null 14 0)
(if (empty? left)
#f
(binary->layout left))
(if (empty? right)
#f
(binary->layout right)))]))
(define (cons->generic tree) tree)
(define (list->generic tree)
(cond
[(empty? tree) empty]
[(not (list? tree)) tree]
[else (cons (car tree) (map list->generic (cadr tree)))]))
(define (struct->generic tree)
(cond
[(empty? tree) empty]
[else (begin
(define v (struct->vector tree))
(define key (vector-ref v 1))
(define children (vector-ref v 2))
(cons key (map struct->generic children)))]))
(define (tree->tree-layout tree)
(cond
[(empty? tree)
(tree-layout #:pict (blank))]
[(not (list? tree))
(tree-layout #:pict (text (~v tree) null 14 0))]
[else
(apply tree-layout
#:pict (text (~v (car tree)) null 14 0)
(map tree->tree-layout (cdr tree)))]))
(define handler-hash (hash
'binary-tree binary->layout
'cons-tree cons->generic
'list-tree list->generic
'struct-tree struct->generic))
(define (visualize tree-type tree)
(pict->bitmap
(naive-layered
(if (symbol=? tree-type 'binary-tree)
((hash-ref handler-hash tree-type) tree)
(tree->tree-layout
((hash-ref handler-hash tree-type) tree))))))