我在Haskell工作,并尝试绘制一个树数据结构,该结构使用具有一个或两个子树的“节点”和“空白树”的“提示”。
绘图过程采用最高级别节点并向上绘制一条直线,其长度等于节点本身的值。
提示没有为它们绘制线条。
从该初始行开始,节点的子节点以与父线成'd'的角度绘制。这些线左边是左边的孩子,右边是节点的右边孩子。这些行的长度分别等于每个孩子的值。
对树结构中的每个节点重复此过程。
我的问题是我们使用单个光标(可以向前,向后和旋转)来绘制树木。 因此,绘制整个树似乎需要某种算法来系统地绘制树(例如,优先绘制左边的孩子,直到到达尖端,然后回溯跟踪并绘制一个正确的孩子)
然而,这种方法似乎非常复杂,因为Haskell无法存储变量,这些变量需要记住光标已经绘制的树的哪些部分。
是否有能够实现此目的的算法? 如果没有,是否还有其他方法可以在2d平面上使用单个光标绘制树?
感谢您的帮助。
答案 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