Difference between revisions of "99 questions/Solutions/62B"
< 99 questions | Solutions
Jump to navigation
Jump to search
(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 |
||
− | where |
||
− | + | | n == 1 = [v] |
|
− | + | | n > 1 = atlevel l (n-1) ++ atlevel r (n-1) |
|
− | + | | otherwise = [] |
|
− | | otherwise = loop l (n+1) ++ loop r (n+1) |
||
</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)