Les arbres AVL
Transcription
Les arbres AVL
Les arbres AVL DUT Informatique – Deuxième année Université du Havre G. Simon/B. Mermet – octobre 2007 Introduction ➲ Pourquoi ● ● ➲ Les arbres équilibrés rendent les recherches plus efficaces Trouver comment maintenir un arbre relativement équilibré au fur et à mesure des insertions (et suppression) Solution : ● ● Les arbres AVL (Adelson-Velskii et Landis) : pour tout sommet, les hauteurs des sousarbres gauche et droit diffèrent d’au plus 1. Rmq : un arbre AVL N'EST PAS un arbre équilibré G. Simon/B. Mermet – octobre 2007 Exemple d'arbre AVL H=4 50 H=2 H=3 40 80 H=2 H=1 20 H=0 Rappel : hauteur arbre vide = -1 G. Simon/B. Mermet – octobre 2007 H=1 45 H=0 30 42 H=0 60 H=1 90 H=0 47 H=0 70 48 Préambule : Rotation droite s1 s2 sa1 s2 sa3 sa2 s1 sa1 sa2 Rotation droite autour de S1, notée rd(S1) G. Simon/B. Mermet – octobre 2007 sa3 Préambule : Rotation gauche s2 s1 s2 s1 sa3 sa1 sa2 sa3 sa1 sa2 Rotation gauche autour de S1, notée rg(s1) G. Simon/B. Mermet – octobre 2007 Insertion dans un arbre AVL Le principe de l'insertion dans un arbre AVL est le suivant : ● ● - insérer le nouveau noeud au bon endroit - au fur et à mesure de la remontée dans l'arbre (du noeud père du noeud inséré à la racine), rééquilibrer l'arbre en effectuant les rotations apropriées G. Simon/B. Mermet – octobre 2007 Choix des rotations ➲ Notations ● ● ● ● ➲ Soient N le noeud courant, Ng son fils gauche et Nd sont fils droit. Soient Ngg le fils gauche de Ng et Ngd le fils droit de Ng Soient Ndg le fils gauche de Nd et Ndd le fils droit de Nd Soit h(x) la hauteur de l'arbre de racine le noeud x. Algorithme ● ● Si |h(Ng)-h(Nd)| <= 1, ne rien faire Sinon ● ● ● ● Si h(Ng)-h(Nd) = 2 ● Si h(Ngg) > h(Ngd) Alors rd(N) ● Sinon rg(Ng) puis rd(N) Sinon (h(Ng)-h(Nd) = -2) ● Si h(Ndd) > h(Ndg) Alors rg(N) ● Sinon rd(Nd) puis rg(N) Fsi Fsi G. Simon/B. Mermet – octobre 2007 cas (1) cas (1a) cas (1b) cas (2) cas (2a) cas (2b) Exemple d'ajout : 49 50 40 80 20 60 45 90 H=2 30 42 N 47 70 H=1 Nd h(Ng) = -1 h(Nd) = 1 h(Ng)-h(Nd) = -2 => cas (2) h(Ndd) > h(Ndg) => cas (2a) : rg(N) 48 H=0 G. Simon/B. Mermet – octobre 2007 49 Ndd Exemple d'ajout : 49 50 40 80 H=2 H=1 20 60 45 30 OK H=1 H=0 H=0 90 42 48 70 H=0 47 G. Simon/B. Mermet – octobre 2007 H=0 49 Exemple d'ajout : 49 50 OK H=3 H=2 N 40 80 H=2 H=1 20 H=1 H=0 60 90 45 30 H=0 H=1 H=0 H=0 42 48 70 H=0 47 G. Simon/B. Mermet – octobre 2007 H=0 49 Exemple d'ajout : 49 OK 50 H=3 H=2 N 40 80 H=2 H=1 20 H=1 H=0 60 90 45 30 H=0 H=1 H=0 H=0 42 48 70 H=0 47 G. Simon/B. Mermet – octobre 2007 H=0 49 Exemple d'ajout : 46 50 N 40 80 N 45 20 H=0 30 42 Ng Nd 60 90 H=2 48 70 H=1 47 46 G. Simon/B. Mermet – octobre 2007 H=0 49 h(Ng) = 0 h(Nd) = 2 h(Ng) – h(Nd) = -2 => cas (2) h(Ndg) > h(Ndd) =>cas (2b) rd(Nd) puis rg(N) Exemple d'ajout : 46 50 N 40 80 N 45 20 30 90 47 42 46 G. Simon/B. Mermet – octobre 2007 60 h(Ng) = 0 h(Nd) = 2 h(Ng) – h(Nd) = -2 => cas (2) h(Ndg) > h(Ndd) =>cas (2b) rd(Nd) puis rg(N) 70 48 49 Exemple d'ajout : 46 H=4 50 H=3 H=2 N 40 80 H=1 H=2 20 H=1 H=0 60 90 47 H=1 H=0 30 H=1 48 45 H=0 H=0 42 G. Simon/B. Mermet – octobre 2007 46 H=0 H=0 70 49 h(Ng) = 0 h(Nd) = 2 h(Ng) – h(Nd) = -2 => cas (2) h(Ndg) > h(Ndd) =>cas (2b) rd(Nd) puis rg(N)