簡體   English   中英

在Haskell中繪制二叉樹結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM