| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- type arbre_bin =
- | Vide
- | Noeud of int * arbre_bin * arbre_bin
- ;;
- let bornesup = 1000000;;
- let borneinf = -1000000;;
- let ex1 =
- Noeud (
- 34,
- Noeud (
- 30,
- Noeud (18, Noeud (10, Vide, Vide), Noeud (8, Vide, Vide)),
- Noeud (20, Noeud (11, Vide, Vide), Noeud (14, Vide, Vide))
- ),
- Noeud (32, Noeud (30, Vide, Vide), Noeud (26, Vide, Vide))
- )
- ;;
- let etiquette f =
- match f with
- | Vide -> failwith "rien"
- | Noeud (n, _, _) -> n
- ;;
- let rec test_file f =
- match f with
- | Vide -> true
- | Noeud (n, g, d) ->
- if
- n >= etiquette g
- && n >= etiquette d
- && test_file g
- && test_file d
- then
- true
- else
- false
- ;;
- let rec echange_etiquette f x = match f with
- | Vide -> Vide
- | Noeud(_,g,d)->Noeud(x,g,d)
- ;;
- let rec percolation arbre =
- match arbre with
- | Vide -> Vide
- | Noeud (n, Vide, Vide) -> Noeud (n, Vide, Vide)
- | Noeud (n, g, d) ->
- let plus_grand_fils =
- if etiquette g >= etiquette d then
- g
- else
- d
- in
- if etiquette plus_grand_fils > n then
- Noeud (etiquette plus_grand_fils, percolation (echange_etiquette g n), d)
- else
- Noeud (n, percolation g, d)
- ;;
- let rec supp_feuille arbre =
- match arbre with
- | Vide -> failwith "Impossible de supprimer une feuille d'un arbre vide"
- | Noeud (n, Vide, Vide) -> Vide, n
- | Noeud (n, g, Vide) ->
- let nouveau_g, feuille_supprimee = supp_feuille g in
- Noeud (n, nouveau_g, Vide), feuille_supprimee
- | Noeud (n, Vide, d) ->
- let nouveau_d, feuille_supprimee = supp_feuille d in
- Noeud (n, Vide, nouveau_d), feuille_supprimee
- | Noeud (n, g, d) ->
- let nouveau_g, feuille_supprimee = supp_feuille g in
- Noeud (n, nouveau_g, d), feuille_supprimee
- ;;
- let supp_racine arbre =
- match arbre with
- | Vide -> failwith "Impossible de supprimer la racine d'un arbre vide"
- | Noeud (n, gauche, droit) ->
- let nouvel_arbre = echange_etiquette arbre (etiquette (fst (supp_feuille arbre))) in
- percolation nouvel_arbre
- ;;
- let rec insere x arbre = match arbre with
- | Vide -> Noeud(x,Vide,Vide)
- | Noeud(r,g,d)-> if x > r then
- begin
- let rand = Random.int 2 in
- if rand = 0 then Noeud(x,insere r g,d)
- else Noeud(x,g,insere r d)
- end
- else
- begin
- let rand = Random.int 2 in
- if rand = 0 then Noeud(r,insere x g,d)
- else Noeud(r,g,insere x d)
- end
- ;;
- let rec file_of_liste l = match l with
- | [] -> Vide
- | t::q-> insere t (file_of_liste q)
- ;;
- let rec arbre_de_tas_aux i tas = match i>= Array.length tas with
- | true -> Vide
- | false ->
- let x = tas.(i) in
- let sous_arbre_gauche = arbre_de_tas_aux (2*i +1) tas in
- let sous_arbre_droite = arbre_de_tas_aux (2*i + 2) tas in
- Noeud(x,sous_arbre_gauche,sous_arbre_droite)
- ;;
- let arbre_de_tas tas = arbre_de_tas_aux 0 tas;;
- let rec taille arbre = match arbre with
- | Vide -> 0
- | Noeud(_,g,d)-> 1 + taille g + taille d
- ;;
- let rec taille arbre =
- match arbre with
- | Vide -> 0
- | Noeud(_, g, d) -> 1 + taille g + taille d
- ;;
- let rec tas_d_arbre_aux i arbre tas =
- match arbre with
- | Vide -> ()
- | Noeud(x, g, d) ->
- tas.(i) <- x;
- tas_d_arbre_aux (2 * i + 1) g tas;
- tas_d_arbre_aux (2 * i + 2) d tas
- ;;
- let tas_d_arbre arbre =
- let n = taille arbre in
- let tas = Array.make n 0 in
- tas_d_arbre_aux 0 arbre tas;
- ;;
- let est_valide_valeur v gauche droite n tas =
- if gauche < n && tas.(gauche) > v then
- false
- else if droite < n && tas.(droite) > v then
- false
- else
- true
- ;;
- let rec est_tas i n tas =
- if i >= n then
- true
- else
- let gauche = 2 * i + 1 in
- let droite = 2 * i + 2 in
- let v = tas.(i) in
- est_valide_valeur v gauche droite n tas && est_tas gauche n tas && est_tas droite n tas
- ;;
- let verification_tas tas =
- let n = Array.length tas in
- est_tas 0 n tas
- ;;
- let echange t i j =
- let aux = t.(i) in
- t.(i)<-t.(j);
- t.(j)<-aux
- ;;
- let rec remonter_aux i t =
- if i = 0 || t.(i) <= t.((i - 1) / 2) then
- ()
- else
- let parent = (i - 1) / 2 in
- let temp = t.(i) in
- t.(i) <- t.(parent);
- t.(parent) <- temp;
- remonter_aux parent t
- ;;
- let remonter n t =
- remonter_aux n t
- ;;
- let insertion x t =
- let n = Array.length t in
- t.(n)<-x;
- remonter n t;
- ;;
- let creation_tab t =
- let resultat = Array.make 100 (-1) in
- for i = 0 to Array.length t -1 do
- insertion t.(i) resultat
- done;
- ;;
- let fils_max k t =
- let fg = 2 * k + 1 in
- let fd = 2 * k + 2 in
- let n = Array.length t in
- if fg < n && fd < n then
- if t.(fg) > t.(fd) then
- fg
- else
- fd
- else if fg < n then
- fg
- else
- k
- ;;
- let rec descente_aux k n t=
- let max_child_index = fils_max k t in
- if max_child_index < n && t.(max_child_index) > t.(k) then
- begin
- let temp = t.(k) in
- t.(k) <- t.(max_child_index);
- t.(max_child_index) <- temp;
- descente_aux max_child_index n t
- end
- ;;
- let descente t =
- let n = Array.length t in
- descente_aux 0 n t
- ;;
- let suppression t =
- let n = Array.length t in
- if n > 0 then begin
- t.(0) <- t.(n - 1);
- descente (Array.sub t 0 (n - 1))
- end
- ;;
- let tri_tas t =
- let n = Array.length t in
- let resultat = Array.make n 0 in
- for i = 0 to n - 1 do
- insertion t.(i) resultat
- done;
- for i = 0 to n - 1 do
- suppression resultat
- done;
- for i = 0 to n - 1 do
- t.(i) <- resultat.(i)
- done
- ;;
|