]> git.rkrishnan.org Git - yorgey.git/commitdiff
exercise #2 of hw4. One possible solution
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sat, 20 Dec 2014 07:05:02 +0000 (12:35 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sat, 20 Dec 2014 07:05:02 +0000 (12:35 +0530)
hw4/hw4.hs

index efeb3f9e6f31f13cfcee59c15cfb664d95c797b8..780ee46864fa9404b5d4cf32f1bdeae19e8a8f30 100644 (file)
@@ -1,3 +1,5 @@
+{-# OPTIONS_GHC -Wall #-}
+
 module Hw4 where
 
 -- wholemeal programming
@@ -35,3 +37,35 @@ fun2' :: Integer -> Integer
 fun2' n = sum $ filter even $ takeWhile (/= 1) $ iterate gen n
     where gen x | even x = x `div` 2
                 | otherwise = 3 * x + 1
+
+-- exercise 2
+-- folding with trees
+
+data Tree a = Leaf
+            | Node Integer (Tree a) a (Tree a)
+              deriving (Show, Eq)
+
+-- generate balanced binary tree using foldr
+height :: Tree a -> Integer
+height Leaf = 0
+height (Node h _ _ _) = h
+
+balanced :: Tree a -> Bool
+balanced Leaf = True
+balanced (Node _ lt _ rt) = abs (height lt - height rt) <= 1 &&
+                            balanced lt && balanced rt
+
+insert :: a -> Tree a -> Tree a
+insert x Leaf = Node 0 Leaf x Leaf
+insert x (Node h lt v rt) | h1 < h2 = Node h (insert x lt) v rt
+                          | h1 > h2 = Node h lt v (insert x rt)
+                          | otherwise = Node (newh + 1) lt v (insert x rt)
+                          where h1 = height lt
+                                h2 = height rt
+                                newh = height (insert x rt)
+
+foldTree :: [a] -> Tree a
+foldTree = foldr f Leaf
+    where f x acc = insert x acc
+
+