Arbres binaires de recherche de coût minimum
Cours · algorithmique (école d'ingénieur), chapitre 9 · école d'ingénieur, informatique · le début du chapitre, la suite sur Adloun
Objectifs du chapitre
- Définir les arbres binaires et les arbres binaires de recherche (abr), et les programmer en Java par des fonctions récursives courtes, justifiées par leur définition.
- Définir le coût moyen de recherche d'un abr, connaissant les fréquences de recherche de ses valeurs.
- Comparer trois constructions : gloutonne, de hauteur minimum (diviser pour régner) et de coût minimum (programmation dynamique).
- Découvrir une récurrence sur des intervalles, calculée par tailles croissantes, le long des diagonales d'un tableau.
9.1 Arbres binaires
Nous avons déjà rencontré les listes d'entiers (chapitre 7) : une liste est soit vide, soit un couple formé d'un premier élément et d'un reste , lui-même une liste. Les arbres binaires se définissent de la même manière, récursivement.
Un arbre binaire (ab) d'entiers est :
- soit l'arbre vide, noté ;
- soit un triplet où est un entier, la valeur à la racine, et où et sont des arbres binaires, les sous-arbres gauche et droit.
L'arbre , dont les deux sous-arbres sont vides, est une feuille.
L'arbre a la valeur à sa racine, la feuille à gauche et la feuille à droite. Les informaticiens le dessinent racine en haut :
9.1.1 Représentation en Java
La classe AB suit la définition : l'arbre vide est représenté par null, un arbre non vide par un objet qui contient sa valeur racine et ses deux sous-arbres.
static class AB {
int vr; AB g, d;
AB(int vr, AB g, AB d) { this.vr = vr; this.g = g; this.d = d; }
}
static boolean vide(AB a) { return a == null; }
static int vr(AB a) { return a.vr; } // a doit être non vide
static AB sag(AB a) { return a.g; } // a doit être non vide
static AB sad(AB a) { return a.d; } // a doit être non vide
L'arbre de l'exemple est construit par new AB(4, new AB(3, null, null), new AB(6, null, null)).
9.1.2 Taille et hauteur
La taille d'un arbre est son nombre de valeurs. Sa hauteur est la longueur (en nombre d'arcs) du plus long chemin depuis la racine. Une feuille est de hauteur ; par une convention cohérente, l'arbre vide est de hauteur . Les deux fonctions s'écrivent en suivant la définition récursive : un cas pour l'arbre vide, un cas pour .
static int taille(AB a) {
if (vide(a)) return 0;
return 1 + taille(sag(a)) + taille(sad(a));
}
static int hauteur(AB a) {
if (vide(a)) return -1;
return 1 + Math.max(hauteur(sag(a)), hauteur(sad(a)));
}
Chaque valeur de l'arbre donne lieu à un appel, et chaque appel est en temps constant (hors appels récursifs) : ces fonctions sont en pour un arbre de taille .
9.2 Arbres binaires de recherche
Un arbre binaire de recherche (abr) est :
- soit l'arbre vide ;
- soit un arbre non vide tel que
- ;
- ;
- et sont des abr.
Toutes les valeurs à gauche de lui sont inférieures, toutes celles à droite lui sont supérieures, et cela est vrai en chaque sommet.
9.2.1 Afficher les valeurs dans l'ordre
Pour afficher les valeurs d'un abr dans l'ordre croissant, il suffit d'afficher celles du sous-arbre gauche (croissantes), puis la racine, puis celles du sous-arbre droit (croissantes). C'est le parcours gauche--racine--droite (grd). Sa justification est exactement la définition des abr :
static void grd(AB a) { // affiche les valeurs de l'abr a dans l'ordre croissant
if (vide(a)) return; // sans rien faire, les valeurs de () sont affichées
grd(sag(a)); // (1) les valeurs de g ont été affichées croissantes
System.out.print(vr(a) + " "); // (2) puis la valeur racine
grd(sad(a)); // (3) puis les valeurs de d, croissantes
// (1), (2), (3) et les propriétés (a), (b) des abr :
// les valeurs de a ont été affichées croissantes
}
La suite du cours est sur Adloun
Le chapitre en entier, formules et figures comprises, avec le tuteur, les fiches, les QCM et les exercices.
Lire la suite du coursEn accès libre, sans inscription.