Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.71 KB | None | 0 0
  1. (* zadanie: Drzewa lewicowe *)
  2. (* autor: Kacper Szczepanski *)
  3. (* recenzent: Pawel Kowalski*)
  4.  
  5. (* typ kopca binarnego *)
  6. (* Node (left, value, right, rh) oznacza, ze to poddrzewo ma lewego syna left, *)
  7. (* priorytet w wierzcholku value, prawego syna right i najbardziej prawa sciezke dlugosci rh *)
  8. type 'a queue = | Node of 'a queue * 'a * 'a queue * int
  9.                 | Leaf
  10.  
  11. (* funkcja sprawdzajaca, czy dana kolejka jest pusta *)
  12. let is_empty q =
  13.   match q with
  14.   | Leaf -> true
  15.   | Node (_, _, _, _) -> false
  16.  
  17. (* wyjatek podnoszony, gdy kolejka przekazana do delete_min jest pusta *)
  18. exception Empty
  19.  
  20. (* funkcja zwracajaca pusta kolejke *)
  21. let empty = Leaf
  22.  
  23. (* funkcja laczaca dwie kolejki w jedna *)
  24. let rec join q1 q2 =
  25.   if is_empty q1 = true then
  26.     q2
  27.   else if is_empty q2 = true then
  28.     q1
  29.   else
  30.     match (q1, q2) with
  31.     | (Node (left1, value1, right1, rh1), Node (left2, value2, right2, rh2)) ->
  32.       if value2 < value1 then
  33.         join q2 q1
  34.       else
  35.         let res = join q2 right1 in
  36.         (match (res, left1) with
  37.         | (Node (left3, value3, right3, rh3), Leaf) -> Node (res, value1, Leaf, 1)
  38.         | (Node (left3, value3, right3, rh3), Node (left4, value4, right4, rh4)) ->
  39.           if rh3 <= rh4 then
  40.             Node (left1, value1, res, rh3 + 1)
  41.           else
  42.             Node (res, value1, left1, rh4 + 1)
  43.         | _ -> assert (false))
  44.     | _ -> assert (false)
  45.  
  46. (* funkcja zwracajaca minimum na kolejce i kolejke bez najmniejszego elementu *)
  47. let delete_min q =
  48.   match q with
  49.   | Leaf -> raise Empty
  50.   | Node (left, value, right, rh) -> (value, join left right)
  51.  
  52. (* funkcja dodajaca element do kolejki *)
  53. let add e q = join (Node (Leaf, e, Leaf, 1)) q
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement