在 haskell 中绘制二叉树结构

Drawing a binary tree structure in haskell

我正在 Haskell 工作并试图绘制一个树数据结构,它使用 'nodes' 有一个或两个 children 树和 'tips' 是空的树.

绘制过程取最高层节点向上绘制一条直线,长度等于节点本身的值

提示没有画线。

从这条初始线开始,节点的 children 与 parent 线成 'd' 角度绘制。对于节点的左侧 children,线向左倾斜,对于节点的右侧 children,线向右倾斜。这些行的长度分别等于每个 child 的值。

这对树结构下的每个节点重复。

我的问题是我们使用单个光标(可以向前、向后和旋转)来绘制树木。 因此绘制整棵树似乎需要某种算法来系统地绘制一棵树(例如优先在左侧绘制 children 直到到达尖端,然后向后跟踪并绘制右侧 child )

但是这种方法看起来非常复杂,因为 Haskell 无法存储变量,这些变量需要记住光标已经绘制了树的哪些部分。

有没有算法可以做到这一点? 如果没有,是否有其他方法可以在二维平面上使用单个光标绘制树?

感谢您的帮助。

假设这是您的绘图 API:

forward :: Int -> IO ()
backward :: Int -> IO ()
rotate :: Double -> IO ()

根据您的描述,树数据类型如下所示:

data Tree
  = Bin Tree Int Tree
  | Tip

然后您可以按照您的建议递归地绘制左子树,然后再绘制右子树:("pre-order depth-first" 遍历树)

draw :: Double -- ^ Angle
     -> Tree
     -> IO ()
draw d Tip = return () -- no lines for Tips
draw d (Bin l v r) = do
  -- draw this node's line
  forward v

  -- draw left subtree
  rotate d
  draw d l

  -- draw right subtree
  rotate (2 * (-d))
  draw d r

  -- return to starting position
  rotate d
  backward v