考慮下面的樹結構在Haskell:哈斯克爾樹列表 - 序遍歷
data Tree = Leaf Int | Node Int Tree Tree deriving Show
我怎樣才能得到哈斯克爾返回序中的數據的列表?
例如給出一棵樹:
Node 1 (Leaf 2) (Leaf 3)
返回類似:
preorder = [1,2,3]
考慮下面的樹結構在Haskell:哈斯克爾樹列表 - 序遍歷
data Tree = Leaf Int | Node Int Tree Tree deriving Show
我怎樣才能得到哈斯克爾返回序中的數據的列表?
例如給出一棵樹:
Node 1 (Leaf 2) (Leaf 3)
返回類似:
preorder = [1,2,3]
好吧,抱歉晚答覆,但我得到這個工作如下:
preorder(Leaf n) = [n]
preorder(Node n treeL treeR) = [n] ++ preorder treeL ++ preorder treeR'code'
然而,這並不正常工作對我而言仍然
preorder (Leaf n) = [n]
preorder (Node n a b) = n:(preorder a) ++ (preorder b)
使用模式匹配
preorder (Leaf n) = [n]
preorder (Node n a b) = n:(preorder a) ++ (preorder b)
你可以瞄準一個更通用的解決方案,讓您的數據類型的Foldable
一個實例。 在hackage有一個非常類似的例子,但是實現了後序訪問。 如果你想支持預購參觀你將不得不寫這樣的事:
import qualified Data.Foldable as F
data Tree a = Leaf a | Node a (Tree a) (Tree a) deriving Show
instance F.Foldable Tree where
foldr f z (Leaf x) = f x z
foldr f z (Node k l r) = f k (F.foldr f (F.foldr f z r) l)
有了這個,你就可以使用每一個上Foldable
類型作品的功能,如elem
,foldr
,foldr
,sum
,minimum
,maximum
等(見here供參考)。
特別是,你正在尋找能與toList
來獲得該列表。下面是你可以通過具有實例聲明寫什麼一些例子:
*Main> let t = Node 1 (Node 2 (Leaf 3) (Leaf 4)) (Leaf 5)
*Main> F.toList t
[1,2,3,4,5]
*Main> F.foldl (\a x -> a ++ [x]) [] t
[1,2,3,4,5]
*Main> F.foldr (\x a -> a ++ [x]) [] t
[5,4,3,2,1]
*Main> F.sum t
15
*Main> F.elem 3 t
True
*Main> F.elem 12 t
False
一旦你滿意,不要忘記接受答案。 – 2012-03-17 10:10:11