[英]Drawing a binary tree structure in haskell
我在Haskell中工作,嘗試繪制一個樹數據結構,該結構使用具有一棵或兩棵子樹的“節點”和為空樹的“技巧”。
繪制過程采用最高級別的節點,並向上繪制一條直線,該直線的長度等於節點本身的值。
提示沒有為它們畫線。
從該初始線開始,以與父線成“ d”角繪制節點的子代。 對於節點的左側子項,這些線向左傾斜,對於右側的子項,這些線向右傾斜。 這些行的長度分別等於每個子項的值。
對於樹結構下的每個節點重復此操作。
我的問題是,我們正在使用單個光標(可以向前,向后和旋轉)繪制樹木。 因此,繪制整棵樹似乎需要某種算法來系統地繪制一棵樹(例如,優先排序左側的子代,直到到達頂端,然后回溯並繪制右側的子代)
但是,這種方法似乎非常復雜,因為Haskell無法存儲變量,而這些變量將需要記住游標已經繪制的樹的哪一部分。
是否有一種算法可以實現這一目標? 如果不是,是否還有其他方法可以在2d平面上使用單個光標繪制樹?
謝謝你的幫助。
假設這是您的繪圖API:
forward :: Int -> IO ()
backward :: Int -> IO ()
rotate :: Double -> IO ()
根據您的描述,樹數據類型如下所示:
data Tree
= Bin Tree Int Tree
| Tip
然后,您可以按照建議遞歸地繪制左側的子樹,然后依次繪制右側的子樹:(樹的“預深度優先”遍歷)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.