99 questions/Solutions/62B

From HaskellWiki
< 99 questions‎ | Solutions
Revision as of 01:06, 14 July 2010 by Wapcaplet (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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 t level = loop t 1
  where
    loop Empty _          = []
    loop (Branch a l r) n 
        | n == level = [a]
        | otherwise  = loop l (n+1) ++ loop r (n+1)

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)