我为二叉树编写了一个简单的按顺序遍历函数(toList1
)。但是,我担心它的复杂性(内存/时间)。有没有更好的方法来实现它?
data Tree a = Empty | Node a (Tree a) (Tree a)
toList1 :: (Tree a) -> [a]
toList1 Empty = []
toList1 (Node x lx rx) = (toList lx) ++ [x] ++ (toList rx)
答案 0 :(得分:3)
Haskell的追加++
在其左参数的长度上线性执行,这意味着如果树向左倾斜,您可能会获得二次性能>。
一种可能性是使用difference list。
另一个是定义Foldable实例:
data Tree a = Empty | Node a (Tree a) (Tree a)
instance Foldable Tree where
foldr f z Empty = z
foldr f z (Node a l r) = foldr f (f a (foldr f z r)) l
然后,顺序遍历自然而然地出现了:
toList :: Tree a -> [a]
toList = foldr (:) []
和
\> let tr = Node "root" (Node "left" Empty Empty) (Node "right" Empty Empty)
\> toList tr
["left","root","right"]