https://www.codewars.com/kata/sort-binary-tree-by-levels 的 Haskell 解法的高票答案,稍加修改就能用在这里。
(剧透警告)
注意这里二叉树的定义方式是
```haskell
data TreeNode a = TreeNode {
left :: Maybe (TreeNode a),
right :: Maybe (TreeNode a),
value :: a
} deriving Show
```
解答:
```haskell
levelOrderBottomUpHierarchical :: Maybe (TreeNode a) -> [[a]]
levelOrderBottomUpHierarchical = reverse . takeWhile (not . null) . go
where
go Nothing = repeat []
go (Just x) = [value x] : zipWith (++) (go $ left x) (go $ right x)
```
测试:
```haskell
leaf v = Just (TreeNode {left = Nothing, right = Nothing, value = v})
t3 = Just (TreeNode {
left = leaf 9,
right = Just (TreeNode {
left = leaf 15,
right = leaf 7,
value = 20
}),
value = 3
})
-- ghci 执行
-- > levelOrderBottomUpHierarchical t3
-- [[15,7],[9,20],[3]]
```