如何在常规树的特定级别打印节点列表?

时间:2015-11-19 16:42:59

标签: haskell

我获得了以下树的定义和功能:

data Tree a = Node a [Tree a] deriving (Eq, Read, Show)

treeRoot :: Tree a -> a
treeRoot (Node a _) = a

treeSubtrees :: Tree a -> [Tree a]
treeSubtrees (Node _ subtrees) = subtrees

我需要创建一个带有两个参数的函数'nodesAtLevel':一个树和一个整数n> = 0.该函数需要返回给定级别n的所有节点的列表。树的根是0级。我是Haskell的新手,是的,这是家庭作业的一部分,所以如果你能帮助我完成完成这个的思考过程,我将不胜感激!我目前有'nodesAtLevel'函数的定义,如下所示:

nodesAtLevel :: Int -> Tree a -> [a]

1 个答案:

答案 0 :(得分:3)

好的,让我们一步一步(暂时留下一些漏洞):

级别为0的节点

据我所知,你只想在这里返回根值(当然在列表中)

那么...会发生什么?

nodesAtLevel 0 (Node a subtrees) = ...

更深层次的节点

结构很好地递归,所以我们可能想要使用递归。

因此,让我们更深层次地递归更深层次(减少我们离开的方式 - 也就是我们的n

但是有一个小问题:nodesAtLevel作用于单个节点,但我们只剩下一个节点列表(subtrees)..那该怎么办?

好吧也许我们应该为每个子树/子节点做一些 - 所以我们需要在这里找到正确的函数f提示你可能想要的 map concat 结果......):

nodesAtLevel n (Node a subtrees) = f (nodesAtLevel (n-1)) subtrees

f可以是什么?你能猜到吗?也许你自己可以自己写呢?

附加提示:

也许你应该首先找出类型 f有什么 - 因为那样你甚至可以使用Hoogle来找到合适的人选。

如果您使用较新的GHC版本,那么如果您编写

,请让编译器完成工作
nodesAtLevel n (Node _ subtrees) = _f (nodesAtLevel (n-1)) subtrees

其中_f漏洞 - 现在,如果你在GHCi中加载它,它会给你一个

Found hole ‘_f’ with type: ....
很多其他信息的错误;)

所以只需找到...f,这应该有用;)

BTW 您可以像我一样使用您已经拥有的功能而不是模式匹配,但我觉得通过这种方式更容易看到结果 - 所以,如果您按照路径进行操作,则不需要使用treeSubtreestreeRoot

溶液

所以一种可行的方法就是:

nodesAtLevel :: Int -> Tree a -> [a]
nodesAtLevel 0 (Node a _) = [a]
nodesAtLevel n (Node _ subtrees) = concatMap (nodesAtLevel (n-1)) subtrees