Arbres AVL Arbres AVL Un arbre AVL est un arbre binaire de recherche balancé i.e un arbre binaire ayant les propriétés suivantes: AV - L Adel’son - Vel’skii Landis arbres binaires (1962) de recherche Soient u , v et w trois noeuds tels que u est dans le sous-arbre gauche de v et w dans son sous-arbre droit. Alors, on a cl é(u) < cl é(v) ≤ cl é(w) Les éléments sont gardés en mémoire dans les noeuds internes 4 44 2 17 Un parcours symétrique de l’arbre visite les clés en ordre croissant 32 3 78 1 Propriété de balance: Pour chaque noeud interne v , la hauteur des enfants de v diffère d’au plus 1 50 48 2 62 1 88 1 1 La hauteur d’un arbre AVL est en O(log n) IFT2810, A2009, Sylvie Hamel Université de Montréal Insérer dans les arbres AVL Chercher dans les arbres AVL Pour insérer un élément (k,v) dans un arbre AVL, on commence par exécuter l’algorithme d’insertion d’un arbre binaire de recherche. Pour chercher un élément de clé k dans un arbre AVL, on procéde exactement de la même façon que pour la recherche dans les arbres binaires de recherche: Sinon, on retourne NULL 2 1 Exemple 1: Chercher(3) IFT2810, A2009, Sylvie Hamel Université de Montréal Arbres AVL 9 < 4 = 8 IFT2810, A2009, Sylvie Hamel Université de Montréal Arbres AVL > 88 62 62 48 < w 44 2 17 78 32 Après l’insertion de (54,v), certains noeuds ne sont plus balancés!! 2 78 50 50 On insère k dans w et on change w en un noeud interne Si k est dans l’arbre l’algorithme chercher(k) se terminera dans un noeud interne w. On applique alors récursivement l’algorithme chercher(k) sur le filsDroit de w, jusqu’à ce qu’on trouve une feuille. > < 32 Si k n’est pas dans l’arbre l’algorithme chercher(k) se terminera dans une feuille w 6 > 17 On commence par exécuter chercher(k) Le prochain noeud visité dépend du résultat de la comparaison de k avec la clé du noeud dans lequel on se trouve. < 44 Exemple 1: Insérer(54,v) Exemple 1: Chercher(4) Si on trouve un noeud interne de clé k, on retourne la valeur correspondant à cette entrée de clé k 1 Arbres AVL 3 50 48 4 88 1 62 54 w 3 Restructuration de l’arbre après une insertion Après l’insertion d’une entrée dans un arbre AVL, il est possible que certains noeuds internes soient débalancés. Pour retrouver la propriété de balance, on va devoir restructurer l’arbre comme suit: z z 2 17 32 On va nommer z le premier noeud débalancé qu’on trouve sur ce chemin. On va nommer y le fils de hauteur Étant donné les noeuds internes x, y et z, on renomme par “a” le premier de ces sommets visités lors d’un parcours symétrique de l’arbre, par “b”, le deuxième et par “c”, le troisième. 44 Les noeuds débalancés sont situés sur le chemin du noeud w à la racine (pourquoi?) y 50 3 48 88 62 54 de plus grande 4 78 x 4 5 débalancé... 3 1 32 1 2y 1 3 62 xb T1 17 ...balancé b B B x A T3 A T2 T0 C T2 T1 z T3 2 2 50 78 1 T1 T4 62 c 1 48 y y T0 3 2 a 5 T2 44 1 1 w Arbres AVL z x 5 T3 T0 32 88 b 62 x 54 1) Rotations simples 88 54 4 3 50 Rotations et lois associatives vers la droite 7 1 4 2 1 4 78 48 C 4 78 50 48 IFT2810, A2009, Sylvie Hamel Université de Montréal c z 6 a 17 32 a y À la fin de la restructuration tous les noeuds internes seront balancés (rebalancement global) Restructuration de l’arbre après une insertion version Goodrich et Tamassia: 2 Appliquer un algorithme de restructuration qui va rebalancer le noeud interne z (rebalancement local) c z 2 17 Rotations et lois associatives Arbres AVL 44 1 44 Goodrich et Tamassia (tableau) w On va nommer x le fils de y de plus grande hauteur (si égalité, on choisit le fils qui est un ancêtre de w ) IFT2810, A2009, Sylvie Hamel Université de Montréal Restructuration de l’arbre après une insertion (suite) (T4 1 54 88 B T2) C T3 T4 B (T2 C T3) T2 T0 IFT2810, A2009, Sylvie Hamel Université de Montréal T1 Arbres AVL T3 6 IFT2810, A2009, Sylvie Hamel Université de Montréal Arbres AVL 7 Rotations et lois associatives Rotations et lois associatives (suite) 2) Rotations doubles 1) Rotations simples (suite) y A z vers la gauche B y B T0 z C T1 T2 x vers la droite A T1 T0 y x C T2 T3 A (T1 B (T0 A T1) B T4 x xB T1 T0 A ((T2 B y z T3 C y A T1 T0 T2 T3 IFT2810, A2009, Sylvie Hamel Université de Montréal C A (T1 T2 T3 T2 B T2 )) C (T0 T3 A Arbres AVL T1 ) B (T2 C T3 ) 9 On va faire une restructuration de l’arbre autour de ce noeud, ce qui causera un rebalancement local. Il est possible que cette restructuration cause le débalancement d’un autre noeud. On va restucturer l’arbre tant qu’il y a un noeud débalancé sur le chemin de p à la racine, où p est le parent du noeud enlevé T2 T3) (T0 T1 T0 z Après la suppression, il est possible que certains noeuds internes soient débalancés (en fait un seul noeud sera débalancé) B C x C Pour supprimer un élément de clé k dans un arbre AVL, on commence par exécuter l’algorithme de suppression d’un arbre binaire de recherche. z T0 B T0 A Supprimer dans les arbres AVL 2) Rotations doubles (suite) A y T3 IFT2810, A2009, Sylvie Hamel Université de Montréal 8 Arbres AVL Rotations et lois associatives (suite) vers la gauche B T1 T4) IFT2810, A2009, Sylvie Hamel Université de Montréal x A T3 T4 T0 z C T4) (T0 Arbres AVL A T1 ) B (T2 C T3 ) 10 IFT2810, A2009, Sylvie Hamel Université de Montréal Arbres AVL 11 Supprimer dans un arbre binaire de recherche (rappel) Si k est pas dans l’arbre, l’algorithme chercher(k) se terminera dans un noeud interne w. Si les fils de w sont tous les deux des noeuds internes alors Pour enlever un élément de clé k dans un arbre binaire de recherche, on commence par exécuter l’algorithme chercher(k). < Exemple 1: Enlever(4) 22 Si k est pas dans l’arbre l’algorithme chercher(k) se terminera dans un noeud interne w Exemple 2: Enlever(3) 6 44 w 8 5 5 12 32 50 48 IFT2810, A2009, Sylvie Hamel Université de Montréal 2 17 17 50 78 54 48 Soit z le premier noeud non balancé sur le chemin allant de ce parent p à la racine de l’arbre. Soit y le fils de z de hauteur maximale et soit x , le fils de y de hauteur maximale Étant donné les noeuds internes x, y et z, on renomme par a le premier de ces sommets visités lors d’un parcours symétrique de l’arbre, par b , le deuxième et par c, le troisième. 88 44 4 p 78 54 17 62 50 T0 48 88 a yb T0 88 54 62 b 44 78 50 17 xc 78 48 c 88 54 T2 T1 T2 T1 T0 IFT2810, A2009, Sylvie Hamel Université de Montréal 13 Arbres AVL za 62 9 Supprimer dans les arbres AVL (suite) 5 p 8 6 44 4 w 2 Exemple: Enlever(32) 44 x 8 Arbres AVL 5 9 y 5 5 Après la suppression d’un noeud, il est possible que son parent p cause un débalancement 62 88 6 9 Supprimer dans les arbres AVL 17 2 1 2 1 w On enlève les noeuds y et x 6 Sinon... 3 33 On enlève l’entrée dans w et on la remplace par l’entrée dans y Si l’un des enfant de w est une feuille, on enlève cette feuille et w IFT2810, A2009, Sylvie Hamel Université de Montréal > 1 On trouve le noeud interne y qui suit w lors d’un parcours symétrique de l’arbre et son fils gauche x 9 > 5 Supprimer dans un arbre binaire de recherche (suite) Arbres AVL 14 a (T1 b T2) IFT2810, A2009, Sylvie Hamel Université de Montréal (T0 Arbres AVL a T1) b T2 15 Performances pour les arbres AVL Supprimer dans les arbres AVL (suite) Rebalancer un noeud prend un temps O(1), si on implémente l’arbre AVL à l’aide d’une structure chaînée Attention!! Il est possible qu’après le rebalancement d’un noeud, un autre noeud (sur le chemin allant vers la racine) se retrouve débalancé L’algorithme de recherche prend un temps O(log n) La hauteur de l’arbre est O(log n) et aucune restructuration est nécessaire L’algorithme d’insertion prend un temps O(log n) Chercher l’endroit où insérer prend un temps O(log n) On continue donc à balancer l’arbre jusqu’à ce qu’on atteingne la racine Trouver un noeud non balancé (si il y en a un) prend un temps O(log n) Restructurer l’arbre prend un temps O(1) L’algorithme de suppression prend un temps O(log n) Exemple au tableau!! Chercher le noeud à enlever prend un temps O(log n) On devra faire, au plus, O(log n) restructuration Chaque restructuration prend un temps O(1) IFT2810, A2009, Sylvie Hamel Université de Montréal Arbres AVL 16 IFT2810, A2009, Sylvie Hamel Université de Montréal Arbres AVL 17