{- Fast, Error Correcting Parser Combinators; Version 2.0.1, April 22, 2001 - Copyright: S. Doaitse Swierstra Department of Computer Science Utrecht University P.O. Box 80.089 3508 TB UTRECHT the Netherlands swierstra@cs.uu.nl -} module UU_BinaryTrees ( BinSearchTree(..) , tab2tree , btFind , btLocateIn ) where -- ======================================================================================= -- ===== BINARY SEARCH TREES ============================================================= -- ======================================================================================= data BinSearchTree av = Node (BinSearchTree av) av (BinSearchTree av) | Nil tab2tree :: [av] -> BinSearchTree av tab2tree tab = tree where (tree,[]) = sl2bst (length tab) (tab) sl2bst 0 list = (Nil , list) sl2bst n list = let ll = (n - 1) `div` 2 ; rl = n - 1 - ll (lt,a:list1) = sl2bst ll list (rt, list2) = sl2bst rl list1 in (Node lt a rt, list2) -- remember we compare the key value with the lookup value btFind :: (a -> b -> Ordering) -> BinSearchTree (a, c) -> b -> Maybe c btLocateIn :: (a -> b -> Ordering) -> BinSearchTree a -> b -> Maybe a btFind = btLookup fst snd btLocateIn = btLookup id id btLookup key val cmp (Node Nil kv Nil) = let comp = cmp (key kv) r = val kv in \i -> case comp i of LT -> Nothing EQ -> Just r GT -> Nothing btLookup key val cmp (Node left kv Nil) = let comp = cmp (key kv) findleft = btLookup key val cmp left r = val kv in \i -> case comp i of LT -> Nothing EQ -> Just r GT -> findleft i btLookup key val cmp (Node Nil kv right ) = let comp = cmp (key kv) findright = btLookup key val cmp right r = val kv in \i -> case comp i of LT -> findright i EQ -> Just r GT -> Nothing btLookup key val cmp (Node left kv right) = let comp = cmp (key kv) findleft = btLookup key val cmp left findright = btLookup key val cmp right r = val kv in \i -> case comp i of LT -> findright i EQ -> Just r GT -> findleft i btLookup _ _ _ Nil = \i -> Nothing