是否可以改进对二叉树的有序遍历的实现?

时间:2016-03-06 19:01:53

标签: haskell binary-tree inorder

我为二叉树编写了一个简单的按顺序遍历函数(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)

1 个答案:

答案 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"]