在haskell中绘制二叉树结构

在haskell中绘制二叉树结构,haskell,tree,drawing,draw,Haskell,Tree,Drawing,Draw,我在Haskell工作,试图绘制一个树数据结构,该结构使用“节点”,其中有一个或两个子树和“提示”,它们是空树 绘制过程采用最高级别的节点,并向上绘制一条长度等于节点本身值的直线 提示没有为它们画线 从该初始线开始,节点的子节点以与父线成“d”的角度绘制。对于节点的左子节点,线向左倾斜;对于节点的右子节点,线向右倾斜。这些行的长度分别等于每个子行的值 这将对树结构下的每个节点重复 我的问题是,我们使用一个光标(可以向前、向后和旋转)来绘制树。 因此,绘制整棵树似乎需要某种算法来系统地绘制一棵树(

我在Haskell工作,试图绘制一个树数据结构,该结构使用“节点”,其中有一个或两个子树和“提示”,它们是空树

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

提示没有为它们画线

从该初始线开始,节点的子节点以与父线成“d”的角度绘制。对于节点的左子节点,线向左倾斜;对于节点的右子节点,线向右倾斜。这些行的长度分别等于每个子行的值

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

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

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

是否有一种算法能够实现这一点? 如果没有,是否有其他方法在二维平面上使用单个光标绘制树


感谢您的帮助。

假设这是您的绘图API:

forward :: Int -> IO ()
backward :: Int -> IO ()
rotate :: Double -> IO ()
根据您的描述,树数据类型如下所示:

data Tree
  = Bin Tree Int Tree
  | Tip
然后,您可以递归地绘制左子树,然后按照建议绘制右子树:(树的“预排序深度优先”遍历)


听起来你想要一个算法,一种可以帮助你“记住光标已经绘制了树的哪些部分所需的变量”的技术是使用。如果你编写的每个绘图函数之后都会将光标移回其原始位置,则无需设置任何状态。简单地在树上递归并写出它。但是如果你展示一些代码(什么是你的绘图API,什么是你的数据类型)会更容易得到帮助。@JoachimBreitner我不确定你的意思,你能详细说明一下吗?看adamse的答案,它几乎把它钉住了。啊,好吧,这很有意义,谢谢你的解释。
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