# 99 questions/Solutions/62B

### From HaskellWiki

< 99 questions | Solutions(Difference between revisions)

(rewrite a little shorter and (imho) clearer) |
|||

Line 5: | Line 5: | ||

<haskell> | <haskell> | ||

atlevel :: Tree a -> Int -> [a] | atlevel :: Tree a -> Int -> [a] | ||

− | atlevel | + | atlevel Empty _ = [] |

− | + | atlevel (Branch v l r) n | |

− | + | | n == 1 = [v] | |

− | + | | n > 1 = atlevel l (n-1) ++ atlevel r (n-1) | |

− | + | | otherwise = [] | |

− | + | ||

</haskell> | </haskell> | ||

## Revision as of 06:35, 22 November 2010

Collect the nodes at a given level in a list

A node of a binary tree is at level N if the path from the root to the node has length N-1. The root node is at level 1. Write a predicate atlevel/3 to collect all nodes at a given level in a list.

atlevel :: Tree a -> Int -> [a] atlevel Empty _ = [] atlevel (Branch v l r) n | n == 1 = [v] | n > 1 = atlevel l (n-1) ++ atlevel r (n-1) | otherwise = []

Another possibility is to decompose the problem:

levels :: Tree a -> [[a]] levels Empty = repeat [] levels (Branch a l r) = [a] : zipWith (++) (levels l) (levels r) atlevel :: Tree a -> Int -> [a] atlevel t n = levels t !! (n-1)