Trier une liste en utilisant un arbre binaire de recherche
#let rec insérer_arbre x arbre = match arbre with
| Vide -> Feuille x
| Feuille y ->
if x < y
then Noeud {Étiquette = y; Fils_gauche = Feuille x;
Fils_droit = Vide}
else Noeud {Étiquette = y; Fils_gauche = Vide;
Fils_droit = Feuille x}
| Noeud {Étiquette = e;Fils_gauche = fg;Fils_droit = fd} ->
if x < e
then Noeud {Étiquette = e;
Fils_gauche = insérer_arbre x fg;
Fils_droit = fd}
else Noeud {Étiquette = e; Fils_gauche = fg;
Fils_droit = insérer_arbre x fd};;
insérer_arbre : 'a -> ('a, 'a) arbre -> ('a, 'a) arbre =
<fun>
#let rec arbre_of_list l = match l with
| [] -> Vide
| x::l' -> insérer_arbre x (arbre_of_list l');;
arbre_of_list : 'a list -> ('a, 'a) arbre = <fun>
#print_arbre print_int print_int
(arbre_of_list [ 2; 5; 4; 6; 3; 7; 1; 8; 0; 5 ]);;
((0(1(234)))5(((56)7)8))- : unit = ()
#let rec list_of_arbre arbre = match arbre with
| Vide -> []
| Feuille f -> [f]
| Noeud {Étiquette = e;Fils_gauche = fg;Fils_droit = fd} ->
(list_of_arbre fg)@[e]@(list_of_arbre fd);;
list_of_arbre : ('a, 'a) arbre -> 'a list = <fun>
#let tri l = list_of_arbre (arbre_of_list l);;
tri : 'a list -> 'a list = <fun>
#tri [ 2; 5; 4; 6; 3; 7; 1; 8; 0; 5 ];;
- : int list = [0; 1; 2; 3; 4; 5; 5; 6; 7; 8]
et maintenant en tenant compte d'une fonction d'ordre totale
#let rec insérer_arbre ordre x arbre = match arbre with
| Vide -> Feuille x
| Feuille y ->
if ordre x y
then Noeud {Étiquette = y; Fils_gauche = Feuille x;
Fils_droit = Vide }
else Noeud {Étiquette = y; Fils_gauche = Vide;
Fils_droit = Feuille x }
| Noeud {Étiquette = e;Fils_gauche = fg;Fils_droit = fd} ->
if ordre x e
then Noeud {Étiquette = e;
Fils_gauche = insérer_arbre ordre x fg;
Fils_droit = fd}
else Noeud {Étiquette = e; Fils_gauche = fg;
Fils_droit = insérer_arbre ordre x fd};;
insérer_arbre :
('a -> 'a -> bool) -> 'a -> ('a, 'a) arbre -> ('a, 'a)
arbre = <fun>
#let rec arbre_of_list ordre l = match l with
| [] -> Vide
| x::l' -> insérer_arbre ordre x (arbre_of_list ordre l');;
arbre_of_list : ('a -> 'a -> bool) -> 'a list -> ('a, 'a)
arbre = <fun>
#let rec list_of_arbre arbre = match arbre with
| Vide -> []
| Feuille f -> [f]
| Noeud a ->
(list_of_arbre a.Fils_gauche)@
[a.Étiquette]@
(list_of_arbre a.Fils_droit);;
list_of_arbre : ('a, 'a) arbre -> 'a list = <fun>
#let tri ordre l = list_of_arbre (arbre_of_list ordre l);;
tri : ('a -> 'a -> bool) -> 'a list -> 'a list = <fun>
#tri (prefix <) [ 2; 5; 4; 6; 3; 7; 1; 8; 0; 5 ];;
- : int list = [0; 1; 2; 3; 4; 5; 5; 6; 7; 8]
#tri (prefix >) [ 2; 5; 4; 6; 3; 7; 1; 8; 0; 5 ];;
- : int list = [8; 7; 6; 5; 5; 4; 3; 2; 1; 0]