Université Paris Diderot – Paris 7 Algorithmique
L3 Informatique Année 2010-2011, 1er semestre
TD n2
Arbres Binaire de Recherche
Le type de donné “arbre" sera utilisé pour indiquer l’ensemble de toutes les Arbres Binaires Étiquetés
(ABEs) par des clés de type entier. La taille de un ABE aest par définition le nombre de clés contenues
dans a. Nous rappelons que un Arbres Binaire de Recherche (ABR) aest un ABE tel que tout nœud
interne bde acontient un clé
supérieure ou égale à toutes le clés contenues dans le sous-arbre gauche de b;
inférieure strictement à toutes le clés contenues dans le sous-arbre droit de b.
Exercice 1 Est-ce que on peut utiliser la procédure suivante pour tester si un ABE aest un ABR ?
Fonction estABR(a:arbre) : booléen1
début2
si (estVide(a)) alors3
retourner vrai;4
si (estVide(G(a))) alors5
gauche := clé(a);6
sinon7
gauche := clé(G(a));8
si (estVide(D(a))) alors9
droite := clé(a);10
sinon11
droite := clé(D(a));12
retourner (gauche clé(a)droite estABR(G(a)) estABR(D(a)));13
fin14
Sinon écrivez une fonction qui teste si un ABE aest un ABR.
Pour un tableau A[1, . . . , n]la définition de “k-ème élément" est très simple à comprendre et l’accès au
k-ème élément est une opération élémentaire (c’est à dire, avec complexité Θ(1)). Au contraire un arbre
binaire n’est pas une structure linéaire et nous pouvons definire plusieur notions de “k-ème élément",
selon la facon dans laquelle nous parcourons l’arbre.
1
Étant donné un ABE quelconque on choisit la façon suivante de numéroter les nœuds de l’arbre :
Fig. 1 – Numérotation des nœuds d’un ABE
Exercice 2 [Accès au k-ème élément] Soit aun ABR.
Question 1. Proposez une méthode pour retourner le k-ème élément de aen utilisant :
une procédure VisiteGRD(a:arbre)qui parcourt complètement l’arbre a.
un tableau d’entiers T.
Quelle est la complexité de cette méthode en fonction de la taille de a?
Question 2. En supposant d’avoir à disposition le type de donnée booléen ×entier, proposez une
fonction RecherchePos(a:arbre, n :entier) : booléen×entier telle que si (b, k) = RecherchePos(a, n)
alors
si la taille de aest inférieure à nalors b=faux et kest la taille de a;
si la taille de an’est pas inférieure à nalors b=vrai et kest la valeur de la k-ème clé.
Quelle est la complexité de cette méthode ?
Question 3. En supposant qu’on dispose d’une fonction taille(a:arbre) : entier calculant la taille
d’un arbre aen Θ(1), proposez une fonction RecherchePos(a:arbre, k :entier) : arbre telle que si
b=RecherchePos(a, k)alors
si taille(a)< n, alors b=ArbreVide() ;
si taille(a)n, alors clé(b)est la k-ème clé dans l’arbre a.
Évaluez la complexité de la procédure en fonction de la hauteur de l’arbre a.
Question 4. En acceptant de modifier légèrement la structure des ABRs, pouvez-vous proposer une
fonction taille(a:arbre) : entier ayant complexité Θ(1) ? Vérifierez que votre modification ne change
pas la complexité des fonctions d’insertion et de suppression d’un nœud dans un ABR.
Exercice 3 [Recherche du successeur] Modifiez légèrment la définition de ABR de telle sorte que
toutes les clés soyent distinctes. On appelle strict un ABR qui satisfait cette définition. Soit aun ABR
strict. Le successeur de un nœud x(s’il existe) est par définition le nœud yayant la plus petit clé entre
le clés plus grand que clé(x).
Question 1. Montrer rigoureusement que dans a:
(a) l’élément minimum se trouve à un nœud sans fils gauche.
(b) si un nœud a un fils droit, son successeur est le minimum de son sous arbre droit. En déduire que
si un nœud a un fils droit, alors son successeur n’a pas de fils gauche.
(c) si un nœud n’a pas de fils droit, son successeur, s’il existe, est le premier de ses ancètres dont le fils
gauche est aussi l’un de ses ancètres.
Question 2. Écrire une fonction succ(b:arbre) : arbre qui retourne le sous arbre de adont la racine
est le successeur de b. Quelle est la complexité en temps de cet algorithme ?
2
Exercice 4 Soit aun ABR strict, soient xun nœud feuille et yson parent. Montrer que clé(x)est soit
la plus petite clé de asupérieure à clé(y), soit la plus grande clé de ainférieure à clé(y).
Exercice 5 On peut trier un tableau Tde nombres entiers en commençant par construire par insertions
successives un ABR contenant ces nombres puis en effectuant un parcours infixe de l’arbre. Quels sont
les temps d’exécution de cet algorithme en fonction de la taille de Tdans le pire et dans le meilleur des
cas ?
Exercice 6 [Insertion à la racine] Dans un arbre binaire de recherche, avec la méthode d’insertion
classique, toutes les nouvelles valeurs sont placées aux feuilles de l’arbre. Si l’on souhaite accéder à un
nœud inséré récemment dans l’arbre, il faudra parcourir toute la hauteur de l’arbre. Dans certaines
applications, on souhaite accéder plus fréquemment aux derniers éléments insérés. Il s’agit du principe
LRU 1. Dans ce cas particulier, il peut être intéressant d’insérer à la racine. En procédant de la sorte, les
valeurs auxquelles on souhaite accéder le plus souvent ont plus de chance d’être à une faible profondeur.
En considérant l’exemple de la figure ?? :
Question 1. Tracez le chemin qui va de la racine au nœud où classiquement il faudrait insérer le nœud
33.
Question 2. À partir des réponses aux questions précédentes, proposez une procédure insertionRacine(a:
arbre, k :entier)d’insertion à la racine dans un ABR.
Évaluer la complexité de cet algorithme dans le pire des cas.
Fig. 2 – un arbre binaire de recherche
1pour Least Recently Used !
3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !