我是Haskell的初学者,我在使用这段代码时遇到了麻烦。任务是为给定的数据类型创建BFS函数。我尝试了很多变化,但问题基本上保持不变:类型不匹配。
data OrdTree a = OrdTree a [OrdTree a]
deriving (Show)
root :: OrdTree a -> a
root (OrdTree x _) = x
children :: OrdTree a -> [OrdTree a]
children (OrdTree _ x) = x
bfsTreeList :: OrdTree a -> [a]
bfsTreeList ot = (map root [ot]) ++ (map bfsTreeList (children ot))
DFS似乎运作得很好:
dfsTreeList :: OrdTree a -> [a]
dfsTreeList ot = root ot : concat (map dfsTreeList (sons ot))
答案 0 :(得分:1)
尝试根据树的级别进行思考。什么是关卡?这是一个子树列表。
type Level a = [OrdTree a]
接下来,您将需要一个函数,给定一个级别,生成下一个级别。您可能会发现此处的函数concatMap
很有用,但并非绝对必要。
nextLevel :: Level a -> Level a
nextLevel = ...
完成此操作后,您将需要一个函数,该函数在给定树的情况下生成其级别列表。这可能是一个无限列表(因为空级别的下一级别也是一个空级别),但在某个点之后它只会填充空级别。在这里,您可能会发现函数iterate
很有用。
levels :: OrdTree a -> [Level a]
levels = ...
最后,您可以使用这些部分构建bfsTreeList
函数。您将使用levels
从树中生成一个级别列表,然后您将切断仅包含空级别的部分,使列表变为有限,然后您将连接列表并检索存储的值: / p>
bfsTreeList :: OrdTree a -> [a]
bfsTreeList = map root . concat . takeWhile (not . null) . levels
以下是您可以用作测试用例的示例树:
exampleTree :: OrdTree Int
exampleTree = OrdTree 1 [ OrdTree 2 [ OrdTree 5 []
, OrdTree 6 []]
, OrdTree 3 [ OrdTree 7 []
, OrdTree 8 [OrdTree 9 []]]
, OrdTree 4 []]
结果应如下所示:
λ. bfsTreeList exampleTree
[1,2,3,4,5,6,7,8,9]