我想实现一个函数,它给出了树中每个分支的深度,并在列表中打包深度的整数。 我知道如何找到最大值和最小值,但我不知道如何找到其他值。
我的代码示例树:
创建我的树:
data NBaum a = NBlatt a | NKnoten a [NBaum a]
deriving(Eq,Show)
示例树:
NKnoten "Sonne"[NKnoten "Jupiter" [NBlatt "Io", NBlatt "Europa", NBlatt "Ganymed", NBlatt "Kallisto"],NKnoten "Mars" [NBlatt "Phobos", NBlatt "Deimos"],NBlatt "Merkur", NBlatt "Venus", NKnoten "Erde" [NBlatt "Mond"]]
最大深度:
tdepth (NBlatt a) = 1
tdepth (NKnoten _ b) = 1 + maximum [tdepth branch | branch <- b]
最小深度:
tdepth (NBlatt a) = 1
tdepth (NKnoten _ b) = 1 + minimum [tdepth branch | branch <- b]
示例树的解决方案,我将拥有:[2,2,3,3,3,3,3,3,3]
。列表的元素可以有另一个订单。
答案 0 :(得分:1)
我离开了递归调用未实现或许这个shell可能会有所帮助:
depths :: (Num b) => NBaum a -> [b]
depths = go 1
where
go n (NBlatt _) = [n]
go n (NKnoten _ xs) = error "depths.go: not implemented"
答案 1 :(得分:0)
听起来好像你想为自己解决这个问题,但这里有一个提示:你有没有编写有序或深度优先的遍历函数?
您可以为遍历功能提供另一个记住深度的参数。每次递归调用都会增加它。不要将节点的内容添加到列表中,而是添加深度。
如果还没有达到这个目的,那么编写该函数的一个好方法是添加一个构造列表的累积参数。从具有空列表和深度1的根开始,每次点击叶节点时,都会将当前深度附加到列表的末尾。在父节点,您将当前深度与从调用女儿的函数返回的列表连接起来。
答案 2 :(得分:0)
请检查一下。我们的想法是将相同的函数应用于NKnoten
中的每个子节点,并使用concat
将结果合并到一个列表中。
depths :: (Num b) => NBaum a -> [b]
depths = go 1
where
go n (NBlatt _) = [n]
go n (NKnoten _ xs) = concat (map (go (n+1)) xs)