TD ABR-Corrigé
TD ABR-Corrigé
TD ABR-Corrigé
Exercice 1 :
Soit A un arbre binaire représenté par des pointeurs contenant des valeurs entières positives et
distinctes et soit x un entier appartenant à l’arbre A. (Utilisez les types Nœud, AB et ABR
définis en cours).
1. Écrire une fonction récursive Max_Val (A : AB) : entier qui permet de retourner la
valeur maximale dans l’arbre binaire A non vide.
X A^.val
Si (A^.fg ≠ Nil et A^.fd ≠ Nil) alors
Y Max_Val ( A^.fg )
Z Max_Val ( A^.fd )
// Maximum(…) Fonction
max Maximum(X, Y, Z ) retournant le maximum
Sinon parmi les valeurs entrées
Si (A^.fg ≠ Nil ) alors en paramètres
Y Max_Val ( A^.fg )
max Maximum(X, Y)
Sinon
Si (A^.fd ≠ Nil ) alors
Z Max_Val ( A^.fd )
max Maximum(X, Z )
Sinon
max X
Fsi
Fsi
Fsi
Retourner ( max )
Fin
2. Nous supposons, dans la suite, que la fonction Min_Val (A : AB): entier, qui retourne
la valeur minimale dans A, est définie.
Ecrire une fonction récursive Est-ABR (A : AB) : booléen qui retourne vrai si A est
un arbre binaire de recherche, faux sinon.
Finsi
Fin
3. Ecrire une fonction récursive Père (A : ABR, x : entier) : ^Nœud qui étant donné un
arbre binaire de recherche A et P un nœud de A permet de retourner l’adresse du nœud
père de P s’il existe, Nil sinon (P est la racine).
Fonction Père ( A : ABR, x : entier) : ^Nœud
Début
Px Recherche ( A, x)
Si (Px ≠ Nil ) alors
Si Px^.fd ≠ Nil ) alors
Retourner ( Min(A^.fd) )
Sinon
Pe Père ( A, x )
Tantque ( Pe ≠ Nil ) et ( Pe^.fd = Px ) Faire
Px Pe
Pe Père ( A, Px^.val )
FinTantque
Si ( Pe = Nil ) alors
Retourner ( -1 )
Sinon
Retourner ( Pe^.val)
Fsi
Finsi
Finsi
Fin
12 3
5 1 24 1
3 0 8 0 17 0 37 2
25 0 49 0
29 0
3. La procédure permettant d’insérer une nouvelle valeur dans un arbre de recherche doit
être modifiée de façon à mettre à jour le champ nbg. Ecrire cette nouvelle procédure
d’insertion.
5. Ecrire une fonction récursive Rang (A: ABR, x : entier): entier qui étant donné un
arbre binaire de recherche A et un élément x retourne son rang (on supposera que x
existe bien dans A).
Pour aider votre camarade, il vous est demandé d’écrire une procédure :
Affiche_interalle ( A : ABR, Vmin, Vmax: réel)
1. qui affiche les valeurs de l’ABR qui appartiennent à l’intervalle [Vmin, Vmax] dans
l’ordre croissant. Vmin et Vmax sont deux constantes réelles données. Cette procédure doit
respecter les régles suivantes:
- le parcours doit être optimisé: on ne doit pas parcourir les sous-arbres si on’a pas
d’espoir de trouver des valeurs appartenant à cet intervalle;
- un arbre dont la racine n’appartient pas à cet intervalle peut avoir dans sa descendance
des nœuds portant des valeurs appartenant à l’intervalle;
On ne fait qu’un seul parcours de l’arbre, sans faire aucune recherche.
a. une procédure Supprime ( A : ABR, x : réél ) qui permet de supprimer une valeur
Si (A ≠ Nil) alors
Si (A^.val < Vmin) alors
Supp_intervalle(A^.fd, Vmin, Vmax)
Sinon
Tantque (A^.val ≤ Vmax et A^.val ≥ Vmin ) Faire // La valeur supprimée est remplacée
Supprime (A, A^.val) // par sa suivante
FinTantque
Supp_intervalle(A^.fg, Vmin, Vmax)
Finsi
Finsi
Fin