Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- David Bai, David Hammarth, Winston Xu, Nick Crews (sort of)
  2.  
  3. --import Debug.Trace (trace)
  4.  
  5. data Color = R | B
  6. data Tree elt = Empty | Node Color ( Tree elt ) elt ( Tree elt )
  7.  
  8. type Set a = Tree a
  9.  
  10. empty :: Set elt
  11. empty = Empty
  12.  
  13. member :: Ord elt => elt -> Set elt -> Bool
  14. member x Empty = False
  15. member x ( Node _ left x2 right ) =
  16.   if x == x2 then True
  17.   else if x < x2 then member x left
  18.   else member x right
  19.  
  20. memberp x Empty = False
  21. memberp x ( Node _ left x2 right ) | x < x2  = memberp x left
  22.                                    | x == x2 = True
  23.                                    | x > x2  = memberp x right
  24.  
  25.  
  26. map_tree :: ( a -> b ) -> ( Tree a ) -> ( Tree b )
  27. map_tree f Empty = Empty
  28. map_tree f ( Node c left x right ) = Node c ( map_tree f left ) ( f x ) ( map_tree f right )
  29.  
  30. insert :: Ord elt => elt -> Set elt -> Set elt
  31. insert x s = makeBlack ( ins s )
  32.   where ins Empty = Node R Empty x Empty
  33.         ins ( Node c left x2 right ) =
  34.           if x < x2 then
  35.             balance c ( ins left ) x2 right
  36.           else if x > x2 then
  37.             balance c left x2 ( ins right )
  38.           else
  39.             Node c left x2 right
  40.  
  41.         makeBlack ( Node _ l x r ) = Node B l x r
  42.  
  43. balance :: Color -> ( Tree elt ) -> elt -> ( Tree elt ) -> Tree elt
  44. balance B ( Node R ( Node  R a x b ) y c ) z d = Node R ( Node B a x b ) y ( Node B c z d )
  45. balance B ( Node R a x ( Node  R b y c ) ) z d = Node R ( Node B a x b ) y ( Node B c z d )
  46. balance B a x ( Node R ( Node  R b y c ) z d ) = Node R ( Node B a x b ) y ( Node B c z d )
  47. balance B a x ( Node R b y ( Node  R c z d ) ) = Node R ( Node B a x b ) y ( Node B c z d )
  48. balance c a x b = Node c a x b
  49.  
  50. ------------------
  51. show_color :: Color -> [Char]
  52. show_color R = "R"
  53. show_color B = "B"
  54.  
  55. instance Show Color where
  56.   show = show_color
  57.  
  58. show_tree :: Show a => (Tree a) -> [Char]
  59. show_tree Empty = "null"
  60. show_tree (Node c left x right) = sl ++ " - " ++ sx ++ " - " ++ sr
  61.   where
  62.     sl = show_tree left
  63.     sr = show_tree right
  64.     sx = show c ++ ": " ++ show x
  65.  
  66. instance ( Show a ) => ( Show (Tree a) ) where
  67.   show = show_tree
  68.  
  69. tree_fold :: (b -> a -> b) -> b -> Tree a -> b
  70. tree_fold f x Empty = x
  71. tree_fold f x (Node c left x2 right) = tree_fold f ( f (tree_fold f x left) x2 ) right
  72.  
  73. set_remove2 :: Show elt => Ord elt => elt -> Set elt -> Set elt --didn't quite work - was trying naive solution for basic BST removal (no balancing)
  74. --set_remove2 :: Ord elt => elt -> Set elt -> Set elt
  75. set_remove2 x Empty = Empty
  76. set_remove2 x (Node c Empty x2 Empty) =
  77.   if x == x2 then Empty
  78.   else Node c Empty x2 Empty
  79. set_remove2 x ( Node c left x2 (Node rc rleft rx rright) ) =
  80.   if x == x2 then Node c left rx ( set_remove2 x (Node rc rleft x2 rright) )
  81.   else if member x left then
  82.     Node c (set_remove2 x left) x2 right
  83.   else if member x right then
  84.     Node c left x2 (set_remove2 x right)
  85.   else (Node c left x2 right)
  86.   where right = (Node rc rleft rx rright)
  87. set_remove2 x ( Node c (Node lc lleft lx lright) x2 right ) =
  88.   if x == x2 then Node c ( set_remove2 x (Node lc lleft x2 lright) ) lx right
  89.   else if member x left then
  90.     Node c (set_remove2 x left) x2 right
  91.   -- else if member x right then  {- right should be empty in this case -}
  92.   --   set_remove2 x right
  93.   else (Node c left x2 right)
  94.   where left = (Node lc lleft lx lright)
  95.  
  96. -- Talked to Nick who mentioned inserting non-parameter elements into a new tree, works but only for trivial trees :(
  97. set_remove :: Ord elt => elt -> Set elt -> Set elt
  98. set_remove x Empty = Empty
  99. set_remove x (Node c left x2 right) = if member x (Node c left x2 right) then new_tree_maker (Node c left x2 right) else (Node c left x2 right)
  100.   where
  101.     new_tree_maker (Node c2 Empty x3 Empty)  = if x2 /= x3 then insert x2 new_tree                else new_tree
  102.     new_tree_maker (Node c2 left2 x3 Empty)  = if x2 /= x3 then insert x2 (new_tree_maker left2 ) else (new_tree_maker left2)
  103.     new_tree_maker (Node c2 Empty x3 right2) = if x2 /= x3 then insert x2 (new_tree_maker right2) else (new_tree_maker right2)
  104.     --new_tree_maker (Node c2 left2 x3 right2) = if x2 != x3 then insert x2 (new_tree_maker left2 )
  105.     new_tree = Empty
  106.  
  107. my_tree = Node R (Node B Empty 5 Empty) 10 (Node B Empty 2 Empty)
  108. tree1 = Node R Empty 10 (Node B Empty 2 (Node R Empty 3 Empty))
  109.  
  110.  
  111.  
  112.  
  113. -----------------------------------------------------------------------------
  114. -----------------------------------------------------------------------------
  115. -----------------------------------------------------------------------------
  116. -----------------------------------------------------------------------------
  117. -----------------------------------------------------------------------------
  118. -----------------------------------------------------------------------------
  119.  
  120.  
  121. -- David Bai, David Hammarth, Winston Xu, Nick Crews (sort of)
  122.  
  123. --import Debug.Trace (trace)
  124.  
  125. data Color = R | B
  126. data Tree elt = Empty | Node Color ( Tree elt ) elt ( Tree elt )
  127.  
  128. type Set a = Tree a
  129.  
  130. empty :: Set elt
  131. empty = Empty
  132.  
  133. member :: Ord elt => elt -> Set elt -> Bool
  134. member x Empty = False
  135. member x ( Node _ left x2 right ) =
  136.   if x == x2 then True
  137.   else if x < x2 then member x left
  138.   else member x right
  139.  
  140. memberp x Empty = False
  141. memberp x ( Node _ left x2 right ) | x < x2  = memberp x left
  142.                                    | x == x2 = True
  143.                                    | x > x2  = memberp x right
  144.  
  145.  
  146. map_tree :: ( a -> b ) -> ( Tree a ) -> ( Tree b )
  147. map_tree f Empty = Empty
  148. map_tree f ( Node c left x right ) = Node c ( map_tree f left ) ( f x ) ( map_tree f right )
  149.  
  150. insert :: Ord elt => elt -> Set elt -> Set elt
  151. insert x s = makeBlack ( ins s )
  152.   where ins Empty = Node R Empty x Empty
  153.         ins ( Node c left x2 right ) =
  154.           if x < x2 then
  155.             balance c ( ins left ) x2 right
  156.           else if x > x2 then
  157.             balance c left x2 ( ins right )
  158.           else
  159.             Node c left x2 right
  160.  
  161.         makeBlack ( Node _ l x r ) = Node B l x r
  162.  
  163. balance :: Color -> ( Tree elt ) -> elt -> ( Tree elt ) -> Tree elt
  164. balance B ( Node R ( Node  R a x b ) y c ) z d = Node R ( Node B a x b ) y ( Node B c z d )
  165. balance B ( Node R a x ( Node  R b y c ) ) z d = Node R ( Node B a x b ) y ( Node B c z d )
  166. balance B a x ( Node R ( Node  R b y c ) z d ) = Node R ( Node B a x b ) y ( Node B c z d )
  167. balance B a x ( Node R b y ( Node  R c z d ) ) = Node R ( Node B a x b ) y ( Node B c z d )
  168. balance c a x b = Node c a x b
  169.  
  170. ------------------
  171. show_color :: Color -> [Char]
  172. show_color R = "R"
  173. show_color B = "B"
  174.  
  175. instance Show Color where
  176.   show = show_color
  177.  
  178. show_tree :: Show a => (Tree a) -> [Char]
  179. show_tree Empty = "null"
  180. show_tree (Node c left x right) = sl ++ " - " ++ sx ++ " - " ++ sr
  181.   where
  182.     sl = show_tree left
  183.     sr = show_tree right
  184.     sx = show c ++ ": " ++ show x
  185.  
  186. instance ( Show a ) => ( Show (Tree a) ) where
  187.   show = show_tree
  188.  
  189. tree_fold :: (b -> a -> b) -> b -> Tree a -> b
  190. tree_fold f x Empty = x
  191. tree_fold f x (Node c left x2 right) = tree_fold f ( f (tree_fold f x left) x2 ) right
  192.  
  193. set_remove2 :: Show elt => Ord elt => elt -> Set elt -> Set elt --didn't quite work - was trying naive solution for basic BST removal (no balancing)
  194. --set_remove2 :: Ord elt => elt -> Set elt -> Set elt
  195. set_remove2 x Empty = Empty
  196. set_remove2 x (Node c Empty x2 Empty) =
  197.   if x == x2 then Empty
  198.   else Node c Empty x2 Empty
  199. set_remove2 x ( Node c left x2 (Node rc rleft rx rright) ) =
  200.   if x == x2 then Node c left rx ( set_remove2 x (Node rc rleft x2 rright) )
  201.   else if member x left then
  202.     Node c (set_remove2 x left) x2 right
  203.   else if member x right then
  204.     Node c left x2 (set_remove2 x right)
  205.   else (Node c left x2 right)
  206.   where right = (Node rc rleft rx rright)
  207. set_remove2 x ( Node c (Node lc lleft lx lright) x2 right ) =
  208.   if x == x2 then Node c ( set_remove2 x (Node lc lleft x2 lright) ) lx right
  209.   else if member x left then
  210.     Node c (set_remove2 x left) x2 right
  211.   -- else if member x right then  {- right should be empty in this case -}
  212.   --   set_remove2 x right
  213.   else (Node c left x2 right)
  214.   where left = (Node lc lleft lx lright)
  215.  
  216. -- Talked to Nick who mentioned inserting non-parameter elements into a new tree, works but only for trivial trees :(
  217. set_remove :: Ord elt => elt -> Set elt -> Set elt
  218. set_remove x Empty = Empty
  219. set_remove x (Node c left x2 right) = if member x (Node c left x2 right) then new_tree_maker (Node c left x2 right) else (Node c left x2 right)
  220.   where
  221.     new_tree_maker (Node c2 Empty x3 Empty)  = if x2 /= x3 then insert x2 new_tree                else new_tree
  222.     new_tree_maker (Node c2 left2 x3 Empty)  = if x2 /= x3 then insert x2 (new_tree_maker left2 ) else (new_tree_maker left2)
  223.     new_tree_maker (Node c2 Empty x3 right2) = if x2 /= x3 then insert x2 (new_tree_maker right2) else (new_tree_maker right2)
  224.     --new_tree_maker (Node c2 left2 x3 right2) = if x2 != x3 then insert x2 (new_tree_maker left2 )
  225.     new_tree = Empty
  226.  
  227. my_tree = Node R (Node B Empty 5 Empty) 10 (Node B Empty 2 Empty)
  228. tree1 = Node R Empty 10 (Node B Empty 2 (Node R Empty 3 Empty))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement