abr.ml 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. type 'a avl = Vide | Noeud of 'a * int * 'a avl * 'a avl;;
  2. type 'a arbre = Vide | Noeud of 'a * 'a arbre * 'a arbre;;
  3. let rec max_arbre a = match a with
  4. | Vide -> 0
  5. | Noeud(r,Vide,Vide) -> r
  6. | Noeud(r,g,d) -> max (max (max_arbre g) (max_arbre d)) r;;
  7. let rec min_arbre a = match a with
  8. | Vide -> 0
  9. | Noeud(r,Vide,Vide) -> r
  10. | Noeud(r,g,d) -> min (min (min_arbre g) (min_arbre d)) r;;
  11. let rec test_abr a = match a with
  12. | Vide -> true
  13. | Noeud(r,Vide,Vide) -> true
  14. | Noeud(r,Vide,d) -> (r <= min_arbre d) && (test_abr d)
  15. | Noeud(r,g,Vide) -> (r >= max_arbre g) && (test_abr g)
  16. | Noeud(r,g,d) -> (r >= max_arbre g) && (r <= min_arbre d) && (test_abr g) && (test_abr d);;
  17. (*Parcours en profondeur en mode infixe d'un ABR*)
  18. let rec parcours_profondeur_infixe a = match a with
  19. | Vide -> []
  20. | Noeud(r,g,d) -> (parcours_profondeur_infixe g) @ [r] @ (parcours_profondeur_infixe d);;
  21. let rec recherche_abr a k = match a with
  22. | Vide -> false
  23. | Noeud(r,g,d) -> if r = k then true else if r < k then recherche_abr d k else recherche_abr g k;;
  24. let rec etiquette_max a = match a with
  25. | Vide -> failwith "Erreur"
  26. | Noeud(r,Vide,Vide) -> r
  27. | Noeud(r,g,d) -> etiquette_max d;;
  28. let rec etiquette_min a = match a with
  29. | Vide -> failwith "Erreur"
  30. | Noeud(r,Vide,Vide) -> r
  31. | Noeud(r,g,d) -> etiquette_min g;;
  32. let rec etiquette_predecesseur a k = match a with
  33. | Vide -> failwith "Erreur"
  34. | Noeud(r,g,d) -> if r = k then
  35. etiquette_max g
  36. else if r < k then
  37. etiquette_predecesseur d k
  38. else etiquette_predecesseur g k;;
  39. let rec etiquette_successeur a k = match a with
  40. | Vide -> failwith "Erreur"
  41. | Noeud(r,g,d) -> if r = k then
  42. etiquette_min d
  43. else if r < k then
  44. etiquette_successeur d k
  45. else etiquette_successeur g k;;
  46. let rec insertion_feuille a k = match a with
  47. | Vide -> Noeud(k,Vide,Vide)
  48. | Noeud(r,g,d) -> if r = k then
  49. a
  50. else if r < k then
  51. Noeud(r,g,(insertion_feuille d k))
  52. else Noeud(r,(insertion_feuille g k),d);;
  53. let rec partition a k = match a with
  54. | Vide -> (Vide,Vide)
  55. | Noeud(r,g,d) -> if r < k then
  56. let (g1,d1) = partition d k in
  57. (Noeud(r,g,g1),d1)
  58. else let (g1,d1) = partition g k in
  59. ( g1,Noeud(r,d1,d));;
  60. (*Inserer la nouvelle racine k grâce à la fonction partition*)
  61. let rec insertion_racine a k = match a with
  62. | Vide -> Noeud(k,Vide,Vide)
  63. | Noeud(r,g,d) -> let (g1,d1) = partition a k in
  64. Noeud(k,g1,d1);;
  65. let rec supprime_etiquette_min a = match a with
  66. | Vide -> failwith "Erreur"
  67. | Noeud(r,Vide,Vide) -> Vide
  68. | Noeud(r,g,d) -> Noeud(r,supprime_etiquette_min g,d);;
  69. (*Supprime l'étiquette k dans a utilisant la fonction supprime_etiquette_min*)
  70. let rec supprime_etiquette a k = match a with
  71. | Vide -> Vide
  72. | Noeud(r,g,d) -> if r = k then
  73. if g = Vide then d else if d = Vide then g else Noeud(etiquette_min d,g,supprime_etiquette_min d)
  74. else if r < k then
  75. Noeud(r,g,(supprime_etiquette d k))
  76. else Noeud(r,(supprime_etiquette g k),d);;