Arbres Rouge noir Démo : INF3105 Structures de données et algorithmes Groupe : 30 Monitrice : Kerlyne Fostine Courriel : fostinekerlyne@yahoo.fr
Arbres rouge noir - Définition Arbre binaire de recherche dans lequel chaque nœud a un attribut supplémentaire : sa couleur, qui est soit rouge soit noire. L’arbre a les propriétés suivantes: Chaque noeud est soit rouge soit noir La racine est noire Si un noeud est rouge, tous ses enfants doivent être noirs À partir de n’importe quel noeud, tous les chemins de la racine jusqu’à un pointeur NULL doivent avoir le même nombre de noeuds noirs
Arbres rouge noir - Exemple 30 70 15 10 20 60 85 5 50 65 80 90 40 55
Arbres rouge noir - exemple 30 70 15 10 20 60 85 5 50 65 90 80 40 55
Arbres rouge noir – exemple
Arbres rouge noir – Contre exemple 30 70 15 10 60 85 2 noeuds noirs 90 5 50 65 80 83 95 40 55 4 noeuds noirs
Arbre rouge noir - Structure Chaque nœud d’un arbre rouge noir doit avoir : Un pointeur parent Un pointeur gauche Un pointeur droit Un champ couleur Un champ element Un champ clef Un nœud peut être : Une sentinelle nul qui sert à représenter les feuilles de l’arbre (Pas de valeur, pas d’élément, de couleur noire, clef de valeur minimum, champs parent, gauche, droite pointent a elle-même) Une sentinelle racine dont les champs parent et droite pointent a la sentinelle nul, sans element, de couleur noire et avec une clef de valeur maximum, et dont le champ de gauche indique le vrai nœud racine.
Arbre rouge noir – Insertion Un noeud inséré est toujours une feuille On peut pas le colorier en noir, puisque cela violerait la condition 4 On colore le noeud en rouge Si le père est noir, pas de problème Si le père est rouge, on viole la condition 3. Dans ce cas, on ajuste l’arbre, par le biais de changements de couleurs et de rotations
Premier cas : Le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir) Noeud inséré G P S X G P D E B S C A C X D E B A Rotation simple
Deuxième cas: le frère du noeud parent est noir (on utilise la convention qu’un noeud NULL est noir) G X S P G P D E B S X A C D E B C Noeud inséré Rotation double
Exemple – Rotation simple 30 70 15 10 (NOIR) 20 60 85 5 3 65 80 90 50 (NOIR) 40 55 Rotation simple Noeud inséré
Exemple : Rotation simple (suite) 30 70 15 20 60 85 5 3 10 (NOIR) 90 50 65 80 (NOIR) 40 55
Exemple – Rotation simple (Suite) 30 70 15 20 60 85 5 3 10 (NOIR) 90 50 65 80 (NOIR) 40 55
Exemple – Rotation simple (suite) 30 70 15 20 60 85 5 3 10 (NOIR) 90 50 65 80 (NOIR) 40 55
Exemple - rotation simple (suite) 30 70 15 5 3 20 60 85 10 (NOIR) 90 50 65 80 (NOIR) 40 55
Exemple – Rotation simple (suite) 30 70 15 20 5 60 85 10 90 3 50 65 80 (NOIR) (NOIR) 40 55
Exemple - Double rotation 30 70 15 10 (NOIR) 20 60 85 65 90 5 50 80 (NOIR) 8 40 55 Noeud inséré
Exemple - Double rotation (Suite) 30 70 15 20 60 85 10 (NOIR) 90 5 50 65 80 (NOIR) 8 40 55
Exemple – Double rotation (Suite) 30 70 15 8 20 60 85 10 90 5 50 65 80 (NOIR) (NOIR) 40 55
Algorithme d’insertion Insertion(z) Y = racine X = racine.gauche Tant que X != nul Y = X if X.clef > Z.clef X = X.gauche else X = X.droite Z.Parent = Y If Y = racine OU Y.clef > z.clef Y.gauche = Z Else Y.droite = Z Z.Gauche = nul Z.Droite = nul z.Couleur = Rouge ajusterInsertion(Z)
Algorithme d’insertion (suite) ajusterInsertion(Z) Tant que couleur Z.parent = Rouge if Z.parent = Z.parent.parent.droite Y = Z.parent.parent.gauche if Couleur Y = Rouge Couleur Z.parent = noir Couleur Y = noir Couleur Z.parent.parent = Rouge Z = Z.parent.parent else if Z = X.parent.gauche Z = Z.parent Rotation droite z Couleur Z.parent = Noir Rotation fauche Z.parent.parent double rotation droite gauche Couleur Racine.gauche = Noir
Algorithme suppression Suppression(Z) Valeur = Z.element If Z.gauche = nul OU Z.droite = nul Y = Z Else Y = Successeur Z If Y.gauche = nul X = Y.droite X = Y.gauche X.parent = Y.parent If Racine = X.parent Racine.gauche = X If Y = Y.parent.gauche Y.parent.gauche = X Y.parent.droite = X
Algorithme suppression (Suite) If Y != Z Y.gauche = Z.gauche Y.droite = X.droite Y.parent = X.parent Z.gauche.parent = Z.droite.parent = Y if Z = Z.parent.gauche Z.parent.gauche = Y else Z.parent.droite = Y If couleur Y = Noir Couleur Y = Couleur Z AjusterSuppression(X) couleur Y = Couleur Z Liberer Z Else Liberer Y Retourner Valeur
Algorithme suppression (Suite) AjusterSuppression(Z) Tant que couleur Z = Noir ET Z != racine if Z = Z.parent.droite W = Z.parent.gauche If Couleur W = Rouge Couleur W = Noir Couleur Z.parent = Rouge Rotation droite Z.parent If couleur W.droite ET W.gauche = Noir Couleur W = Rouge Z = Z.parent Else if Couleur W.gauche = Noir Couleur W.droite = Noir Rotation gauche W Couleur W = Couleur Z.parent Couleur Z.parent = Noir Couleur W.gauche = Noir Z = racine Rotation double droite gauche Couleur z = noir
Références Structures de données avancées avec la STL http://www.cours.polymtl.ca/inf1101/Hiver2005/Note/Arbres