在haskell

时间:2015-11-22 16:43:59

标签: haskell tree drawing draw

我在Haskell工作,并尝试绘制一个树数据结构,该结构使用具有一个或两个子树的“节点”和“空白树”的“提示”。

绘图过程采用最高级别节点并向上绘制一条直线,其长度等于节点本身的值。

提示没有为它们绘制线条。

从该初始行开始,节点的子节点以与父线成'd'的角度绘制。这些线左边是左边的孩子,右边是节点的右边孩子。这些行的长度分别等于每个孩子的值。

对树结构中的每个节点重复此过程。

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

然而,这种方法似乎非常复杂,因为Haskell无法存储变量,这些变量需要记住光标已经绘制的树的哪些部分。

是否有能够实现此目的的算法? 如果没有,是否还有其他方法可以在2d平面上使用单个光标绘制树?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

假设这是您的绘图API:

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

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

data Tree
  = Bin Tree Int Tree
  | Tip

然后你可以按照你的建议递归绘制左边的子树,然后右边绘制:( a"预先订购深度优先"遍历树)

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