我在Scheme中看到过这样的二进制树。
5
3 8
1 4 6 9
我可以用下面这样的列表来表示它。
'(5 (3 (1 () ()) (4 () ())) (8 (6 () ()) (9 () ())))
类似于Newick格式,但这是用于无根树的。我想知道在Scheme或Racket中是否有一种简单的方法来可视化这种基于列表的树。是不是有一个基于列表的树查看器,就像在。http:/etetoolkit.orgtreeview中的树形查看器
谢谢你
是的,这很容易。 这里有一些中等恐怖的东西(恐怖之处在于半生不熟地试图抽象掉显式列表表示法)。
(require pict
pict/tree-layout)
(define (show-tree tree
#:node-null? (node-null? null?)
#:node? (node? list?)
#:node-value (node-value first)
#:node-children (node-children rest))
(define (tree-layout* this children)
(apply tree-layout children #:pict this))
(define (show/r node)
(unless (node? node)
(error 'show-tree "~A isn't a node" node))
(if (node-null? node)
#f
(tree-layout* (cc-superimpose
(disk 20 #:color "white")
(text (format "~A" (node-value node))))
(map show/r (node-children node)))))
(naive-layered (show/r tree)))
这可以画出不是二进制树的树,但是对于节点的值比它期望的要长的节点,它就会有问题。我一直觉得Racket的树形布局算法在这种情况下有点不灵活,但我可能只是不理解它。