Adloun

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) et int 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

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →