algorithmique (école d'ingénieur) · Chapitre 9 · Exercice de TD
Minimum, maximum, est-ce un abr ?
Arbres binaires de recherche de coût minimum · niveau 2
Énoncé
- Écrire
int min(AB a)etint max(AB a)pour un abr non vide, en où est la hauteur. - Un étudiant propose de tester si un arbre binaire est un abr en vérifiant, en chaque nœud, que la racine du sous-arbre gauche est plus petite et que celle du sous-arbre droit est plus grande. Donner un contre-exemple.
- Écrire
boolean estABR(AB a)correcte, en . Indication : passer en paramètres les bornes que doivent respecter les valeurs du sous-arbre.
Corrigé
- Le minimum est tout en bas à gauche, le maximum tout en bas à droite :
static int min(AB a) { return vide(sag(a)) ? vr(a) : min(sag(a)); } // a non vide
static int max(AB a) { return vide(sad(a)) ? vr(a) : max(sad(a)); }
On descend d'un niveau par appel : .
- L'arbre passe le test local ( et ), mais est dans le sous-arbre gauche de alors que : ce n'est pas un abr.
- Toutes les valeurs du sous-arbre gauche doivent être inférieures à la racine, et celles du sous-arbre droit supérieures : on transmet ces bornes.
static boolean estABR(AB a, long bi, long bs) { // toutes les valeurs dans ]bi, bs[
if (vide(a)) return true;
return bi < vr(a) && vr(a) < bs
&& estABR(sag(a), bi, vr(a)) && estABR(sad(a), vr(a), bs);
}
static boolean estABR(AB a) { return estABR(a, Long.MIN_VALUE, Long.MAX_VALUE); }
contre-exemple (5 (3 () (8 () ())) (9 () ())) : localement ordonné = true, estABR = false
Les bornes en long évitent d'exclure les valeurs Integer.MIN_VALUE et Integer.MAX_VALUE. Un appel par sous-arbre : .
100 % gratuit
La suite du chapitre est sur Adloun
- 10 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.