Haskell Tree to List - preorder遍历

时间:2012-02-29 00:50:15

标签: haskell tree tree-traversal

在Haskell中给出以下树结构:

data Tree = Leaf Int | Node Int Tree Tree deriving Show

如何让Haskell按预订顺序返回数据列表?

e.g。给了一棵树:

Node 1 (Leaf 2) (Leaf 3)

返回类似的内容:

preorder = [1,2,3]

2 个答案:

答案 0 :(得分:5)

您可以瞄准更通用的解决方案,并使您的数据类型成为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类型的所有功能,例如elemfoldrfoldrsumminimummaximum等(请参阅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

答案 1 :(得分:3)

使用模式匹配

preorder (Leaf n) = [n]
preorder (Node n a b) = n:(preorder a) ++ (preorder b)