-------------------------------------------some Tree functions

data Tree a = Inner a (Tree a) (Tree a) | Leaf a
                                 -- recursive polymorphic type

miniTree = Inner 1 (Inner 2 (Leaf 3) (Leaf 4)) (Leaf 5)

listInorderTree :: (Show a) => Tree a -> String
listInorderTree (Leaf x) = show x
listInorderTree (Inner x yt zt)
      = "<" ++ (listInorderTree yt) ++ 
                  "<" ++ (show x) ++ ">" ++
                           (listInorderTree zt) ++ ">"

{-
Main> listInorderTree miniTree
"<<3<2>4><1>5>"
-}

sizeOfTree :: Tree a -> Int
sizeOfTree (Leaf x) = 1
sizeOfTree (Inner x yt zt) = 1 + (sizeOfTree yt) + (sizeOfTree zt)


mapTree :: (a->b) -> Tree a -> Tree b
mapTree f (Leaf x) = Leaf (f x)
mapTree f (Inner x yt zt) = (Inner (f x) (mapTree f yt) (mapTree f zt))

{-
Main> listInorderTree miniTree
"<<3<2>4><1>5>"
Main> sizeOfTree miniTree
5
Main> listInorderTree (mapTree (*100) miniTree)
"<<300<200>400><100>500>"
-}

