这是我的Guidline:
data BinTree α = Empty
| Node (BinTree α) α (BinTree α)
deriving (Eq, Show)
现在我想创建一个函数:
levels :: BinTree a -> [[a]]
这应该在列表中打印出二进制树,但是每个级别都是自己的。例如:[[1],[2,3],[4,5,6,7]]
或
[1]
[2,3]
[4,5,6,7]
...
我定义了roots
和childs
:
roots ts = [ a | Node _ a _ <- ts ]
childs ts = [ t | Node l _ r <- ts, t <- [l, r] ]
和遍历函数,它获取子树及其节点的列表。
traverse' :: [BinTree α] -> [α]
traverse' [] = []
traverse' ts = roots ts ++ traverse' (childs ts)
levels :: BinTree α -> [α]
levels t = traverse [t]
但那不是我真正想要的。有人有想法。
答案 0 :(得分:1)
这很好用:
f Empty = []
f (Node l v r) = case (f l, f r) of
((x:xs),(y:ys)) -> [[v],x++y] ++ (zipWith (++) xs ys)
([],[]) -> [[v]]
......
完成模式。 (您可以使用完整的树来测试它,以确保它是一个良好的开端)。