Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 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. | (Leaf, Leaf) -> assert (false)
  32. | (Leaf, Node (_, _, _, _)) -> assert (false)
  33. | (Node (_, _, _, _), Leaf) -> assert (false)
  34. | (Node (left1, value1, right1, rh1), Node (left2, value2, right2, rh2)) ->
  35. if value2 < value1 then
  36. join q2 q1
  37. else
  38. let res = join q2 right1 in
  39. match (res, left1) with
  40. | (Leaf, Leaf) -> assert (false)
  41. | (Leaf, Node (_, _, _, _)) -> assert (false)
  42. | (Node (left3, value3, right3, rh3), Leaf) -> Node (res, value1, Leaf, rh3 + 1)
  43. | (Node (left3, value3, right3, rh3), Node (left4, value4, right4, rh4)) ->
  44. if rh3 <= rh4 then
  45. Node (left1, value1, res, rh3 + 1)
  46. else
  47. Node (res, value1, left1, rh4 + 1)
  48.  
  49. (* funkcja zwracajaca minimum na kolejce i kolejke bez najmniejszego elementu *)
  50. let delete_min q =
  51. match q with
  52. | Leaf -> raise Empty
  53. | Node (left, value, right, rh) -> (value, join left right)
  54.  
  55. (* funkcja dodajaca element do kolejki *)
  56. let add e q = join (Node (Leaf, e, Leaf, 1)) q
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement