module BTree where data BTree a = Empty | Node a (BTree a) (BTree a) deriving (Eq, Show, Read) size :: BTree a -> Integer size Empty = 0 size (Node _ l r) = size l + size r + 1 height :: BTree a -> Integer height Empty = 0 height (Node _ l r) = max (height l) (height r) + 1 fromList :: [a] -> BTree a fromList [] = Empty fromList (x:xs) = Node x Empty (fromList xs) make :: [a] -> BTree a make [] = Empty make xs = Node z (make ys) (make zs) where m = length xs `div` 2 (ys, z:zs) = splitAt m xs searchTree :: Ord a => [a] -> BTree a searchTree = foldr insert Empty where insert x Empty = Node x Empty Empty insert x (Node y l r) | x < y = Node y (insert x l) r | otherwise = Node y l (insert x r) flatten :: BTree a -> [a] flatten Empty = [] flatten (Node x l r) = flatten l ++ [x] ++ flatten r