首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Tree to List - preorder遍历

Haskell Tree to List - preorder遍历
EN

Stack Overflow用户
提问于 2012-02-29 08:50:15
回答 3查看 5K关注 0票数 4

给定Haskell中的以下树结构:

代码语言:javascript
复制
data Tree = Leaf Int | Node Int Tree Tree deriving Show

如何让Haskell返回预排序的数据列表?

例如,给定一棵树:

代码语言:javascript
复制
Node 1 (Leaf 2) (Leaf 3)

返回类似如下的内容:

代码语言:javascript
复制
preorder = [1,2,3]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-19 11:26:15

好吧,很抱歉回复得太晚了,但我按如下方式解决了这个问题:

代码语言:javascript
复制
preorder(Leaf n) = [n]
preorder(Node n treeL treeR) = [n] ++ preorder treeL ++ preorder treeR'code'

然而,这对我仍然不起作用。

代码语言:javascript
复制
preorder (Leaf n) = [n]   
preorder (Node n a b) = n:(preorder a) ++ (preorder b) 
票数 2
EN

Stack Overflow用户

发布于 2012-02-29 19:51:42

您可以着眼于更通用的解决方案,使您的数据类型成为Foldable的实例。在hackage上有一个非常类似的示例,但它实现了后订单访问。如果你想支持预购访问,你必须编写类似这样的代码:

代码语言:javascript
复制
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获得。以下是通过使用实例声明可以编写内容的一些示例:

代码语言:javascript
复制
*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
票数 5
EN

Stack Overflow用户

发布于 2012-02-29 08:57:07

使用模式匹配

代码语言:javascript
复制
preorder (Leaf n) = [n]
preorder (Node n a b) = n:(preorder a) ++ (preorder b)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9492109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档