Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.57 KB | None | 0 0
  1.  
  2. module COMPARISON =
  3.   struct
  4.    type comparison = Less | Equal | Greater
  5.   module type COMPARABLE =
  6.    sig
  7.       type t
  8.       val cmp : t -> t -> comparison
  9.     end
  10. end      
  11.          
  12. module IntCmp : COMPARISON.COMPARABLE =
  13.   struct
  14.     include COMPARISON
  15.     type t = int
  16.     let cmp x y = if (x - y = 0) then Equal else
  17.                     (if (x - y < 0) then Less else Greater)
  18. end                
  19.                      
  20.  
  21.  
  22. module BST (C : COMPARISON.COMPARABLE) :
  23.   sig
  24.     type t
  25.     type tree
  26.     val add : t -> tree -> tree
  27.     val del : t -> tree -> tree
  28.     val createFromList : t list -> tree
  29.   end = struct
  30.   include COMPARISON
  31.   type t = C.t
  32.   type tree = Nil | Node of t * tree * tree            
  33.   let rec add (elm : t) = function
  34.     | Nil -> Node (elm, Nil, Nil)
  35.     | Node (e, l, r) -> if C.cmp elm e = Less
  36.                         then Node (e, add elm l, r)
  37.                         else Node (e, l, add elm r)
  38.  
  39.   let rec del_aux_left = function
  40.     | Nil -> Nil
  41.     | Node (_, l, Nil) -> l
  42.     | Node (e, l, Node (e', l', Nil)) -> Node (e, l, l')
  43.     | Node (e, l, r) -> Node (e, l, del_aux_left r)
  44.  
  45.   let rec del_aux_right = function
  46.     | Nil -> Nil
  47.     | Node (_, Nil, r) -> r
  48.     | Node (e, Node (e', Nil, r'), r) -> Node (e, r', r)
  49.     | Node (e, l, r) -> Node (e, del_aux_right l, r)                                              
  50.  
  51.   let rec closestLeft default = function
  52.     | Nil -> default
  53.     | Node (e, _, Nil) -> e
  54.     | Node (e, _, r) -> closestLeft default r
  55.                                    
  56.   let rec closestRight default = function
  57.     | Nil -> default      
  58.     | Node (e, Nil, _) -> e
  59.     | Node (e, l, _) -> closestLeft default l
  60.                                    
  61.   (* how to have lessthan and equal in scope *)
  62.   let rec del (elm : t) = function
  63.     | Nil -> Nil
  64.     | Node (e, l, r) -> if C.cmp elm e = Equal
  65.                         then (match l with
  66.                              | Nil -> (match r with
  67.                                        | Nil -> Nil
  68.                                        | node -> Node (closestRight e node, l, del_aux_right r))
  69.                              | node -> Node (closestLeft e node, del_aux_left node, r))
  70.                         else (if C.cmp elm e = Less
  71.                               then Node (e, del elm l, r)
  72.                               else Node (e, l, del elm r))
  73.  
  74.   let rec createFromList_aux = function
  75.     | [] -> Nil
  76.     | x :: xs -> add x (createFromList_aux xs)
  77.  
  78.   let rec createFromList l = createFromList_aux (List.rev l)
  79.  
  80. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement