在haskell中绘制二叉树结构
我在Haskell工作,试图绘制一个树数据结构,该结构使用“节点”,其中有一个或两个子树和“提示”,它们是空树 绘制过程采用最高级别的节点,并向上绘制一条长度等于节点本身值的直线 提示没有为它们画线 从该初始线开始,节点的子节点以与父线成“d”的角度绘制。对于节点的左子节点,线向左倾斜;对于节点的右子节点,线向右倾斜。这些行的长度分别等于每个子行的值 这将对树结构下的每个节点重复 我的问题是,我们使用一个光标(可以向前、向后和旋转)来绘制树。 因此,绘制整棵树似乎需要某种算法来系统地绘制一棵树(例如,在到达尖端之前,优先在左侧绘制子对象,然后回溯并绘制右侧子对象) 然而,这种方法看起来非常复杂,因为Haskell无法存储变量,而这些变量是记住光标已经绘制了树的哪些部分所必需的 是否有一种算法能够实现这一点? 如果没有,是否有其他方法在二维平面上使用单个光标绘制树在haskell中绘制二叉树结构,haskell,tree,drawing,draw,Haskell,Tree,Drawing,Draw,我在Haskell工作,试图绘制一个树数据结构,该结构使用“节点”,其中有一个或两个子树和“提示”,它们是空树 绘制过程采用最高级别的节点,并向上绘制一条长度等于节点本身值的直线 提示没有为它们画线 从该初始线开始,节点的子节点以与父线成“d”的角度绘制。对于节点的左子节点,线向左倾斜;对于节点的右子节点,线向右倾斜。这些行的长度分别等于每个子行的值 这将对树结构下的每个节点重复 我的问题是,我们使用一个光标(可以向前、向后和旋转)来绘制树。 因此,绘制整棵树似乎需要某种算法来系统地绘制一棵树(
感谢您的帮助。假设这是您的绘图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