绘制二叉树

问题描述 投票:0回答:1

我在Scheme中看到过这样的二进制树。

           5
      3          8
   1     4    6      9

我可以用下面这样的列表来表示它。

'(5 (3 (1 () ()) (4 () ())) (8 (6 () ()) (9 () ())))

类似于Newick格式,但这是用于无根树的。我想知道在Scheme或Racket中是否有一种简单的方法来可视化这种基于列表的树。是不是有一个基于列表的树查看器,就像在。http:/etetoolkit.orgtreeview中的树形查看器

谢谢你

tree racket
1个回答
0
投票

是的,这很容易。 这里有一些中等恐怖的东西(恐怖之处在于半生不熟地试图抽象掉显式列表表示法)。

(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的树形布局算法在这种情况下有点不灵活,但我可能只是不理解它。

© www.soinside.com 2019 - 2024. All rights reserved.