Académique Documents
Professionnel Documents
Culture Documents
247 289
247 289
Arbre initial A 5
…
3 7 • Pour éviter des réorganisations
douloureuses en temps de calcul, on
2 4 6
assouplit les conditions d’équilibrage,
Arbre initial – pour limiter le coût de la réorganisation
A 5
dans lequel … – tout en gardant des performances
on insère 1 3 7
logarithmiques pour la recherche, l’insertion et
2 4 6 la suppression!
Retour à A 4
l’équilibre …
2 6
1 3 5 7 291
290
290 291
292 293
292 293
1
Rotation simple à droite Rotation double à droite
• A faire dans le 1er cas : déséquilibre « à • A faire dans le 2ème cas : déséquilibre « à
gauche toute » droite de la gauche»
Hauteurs h1=h+1 h2=h3=h • La rotation double à droite commence par
une rotation gauche sur le sous arbre G
puis une rotation droite sur N
2 0
h+3 N h+2 G
0 N
2
1 h+1
h+2 h
G
3 h+1 1
N
1 G
h+1 1 h 2 h 3 3
h 2
1 2
294 295
294 295
N
2 1, 2 et 3 sont vides avant N N
1 G l’insertion (h=0)
b) Sous cas où le sous-arbre 2 G G
3
est déséquilibré sur sa D D
1 2
gauche
c) Sous cas où le sous-arbre 2
est déséquilibré sur sa droite
296 297
296 297
2 2 0 0
h+3 N h+3 N h+2 D h+3 N 2 h+3 N 2 h+2 D
298 299
298 299
2
• Les symétriques de ces opérations existent dans • Ajouts successifs de 4, 3, 1, 6, 7, 5, 2
le cas d’un déséquilibre alourdissant un sous- dans l’arbre vide
arbre droit après une insertion
– Rotation gauche
– Rotation droite-gauche
300 301
300 301
• Ajouts successifs de 4, 3, 1, 6, 7, 5, 2
dans l’arbre vide • Comment pister / stocker les déséquilibres?
0 1
[ insertion 1
-1 – 1ère solution : Conserver l’info de hauteur dans
4 4 ROTD(4)] 30 3 chaque nœud
-1
3 1 4 1 4 – 2ème solution : Ne conserver dans chaque nœud
6 que la différence de hauteur entre le sous-arbre
[ insertion 7 gauche et le sous-arbre droit
ROTG(4)]
-1
4 [Insertion 2 4 [Insertion 5 3
DROTD(3)] 1 DROTG(3)]
2 6 3 6 1 6
1 3 5 7 1 5 7 4 7
302 303
302 303
304 305
3
procédure équilibrer( donnée-résultat a : ABR, pN : pointeur sur Nœud )
Précondition : pN->diff=2 ou -2
début
Insertion dans un AVL
si pN->diff=2 alors
si pN->gauche->diff=1 alors • Insertion aux feuilles : parcours d’un chemin menant de la
AVL_Rotation_Droite(a,pN) racine au nouvel élément
sinon
AVL_Rotation_Double_Droite(a,pN) • Parcours du chemin en sens inverse,
finsi – pour mettre à jour les différences de hauteur des nœuds ancêtres,
sinon – et effectuer une opération de rééquilibrage si nécessaire!
si pN->droite->diff=-1 alors
AVL_Rotation_Gauche(a,pN)
sinon • Parcours du chemin en sens inverse :
AVL_Rotation_Double_Gauche(a,pN) – facile si la procédure d’insertion est récursive,
finsi (il suffit de mettre les instructions relatives à la remontée après
finsi l’appel récursif)
fin – la remontée peut s’arrêter à partir du moment où le champ diff d’un
nœud n’est plus modifié
306 307
306 307
• Version itérative
Complexité – C’est uniquement sur le chemin racine / nouvelle feuille
qu’il peut y avoir des rotations
• Temps d’une rotation : constant – On considère sur ce chemin le nœud N le plus bas (le
dernier rencontré à la descente) dont le champ diff != 0
• Note : Insertion exécute AU PLUS UNE rotation – On peut démontrer que si rotation il doit y avoir après
car une rotation sur un nœud rétablit la hauteur l’insertion ca sera sur ce Noeud
initiale (avant insertion) du sous-arbre
correspondant A
Entre A et N l’adjonction
n’a pas pu causer de
• A arbre AVL à n nœuds problème.
N= nœud le + bas
• Temps total d’un ajout : O(h(A)) = O(log n) car t. que N->diff != 0
une seule branche de l’arbre est examinée N
308 309