1
Arbre Binaire de Recherche
• Un Arbre Binaire de Recherche (ABR) est un arbre binaire avec les propriétés suivantes :
– La clé associée à un noeud est supérieur aux clés des nœuds de son sous-arbre gauche
– La clé associée à un noeud est inférieur aux
clés des nœuds de son sous-arbre droit
2
Arbre Binaire de Recherche
• propriété d’un a.b.r : A
1∀ x nœud ∈ A
1racine(g(x)) <= racine(x) < racine(d(x))
3
Arbre Binaire de Recherche:
Exemples
C
A D
14 10
15 11
8 18
16
14 10
15 11
8
16 racine
racine
racine
4
ABR : Ajout d’un élément
Comment ajouter aux feuilles
La même procédure que Rech_abr s’applique:
Déterminer la position d’insertion par Rech_abr.
Ajouter la nouvelle clé si la recherche échoue.
Exemple:
1 8
5
3 4
2
9
ajout 4?
5
Construction d’un ABR
Exemple: ajouter C A B L M (dans l’ordre!)
1) Ajouter C C
2) ajouter A
C A
3) ajouter B C A
B 4) Ajouter L C
A
B L
5) Ajouter M
C A
B L
M
6
Construction d’un ABR
L’ABR est-il unique pour une séquence de lettres A B C L M ?
NON! différentes séquences donnent différents ABR
C A
B L
M A
B
C
L
M
Ajout de : A B C L M Ajout de : C A B L M
7
Trier avec un ABR
Soit un ABR, peut-on afficher les clés dans l’ordre?
Visiter l’ABR avec un parcours InOrdre:
visiter le sous-arbre gauche afficher racine
visiter le sous-arbre droit
C A
B L
M Example:
A B C L M infixe: affichage:
8
ABR : supprimer un élément
Pour supprimer un nœud contenant x,
rechercher x, une fois trouvé appliquer l’un des trois cas suivants:
CAS 1: x est une feuille
x
supprimer x On obtient un ABR q
r
q r
p p
9
ABR : supprimer un élément
Cas 2: x est un nœud interne avec un seul Sous-arbre
L
x q
r
suppr x L
q r
On obtient un ABR
10
ABR : supprimer un élément
Cas 3: x est un nœud interne avec 2 sous-arbres
W
x q
r
suppr x
Z t s
u
W q
r
suppr x s Z
u
propriété ABR est conservé t
11
ABR : supprimer un élément
Cas 3 suite
W q r
s Z
u t
q < x < u
q est inférieur au plus petit élément de Z
r est supérieur au plus grand élément de W
12
ABR : Compléxité de rechercher
• Quelle est la compléxité de Rech_abr ?
• Dépend de :
– la clé x
– des autres données
– De la forme de l’arbre
Analyse de la compléxité : On est intéréssé par la compléxité dans le meilleur cas, pire cas et
en moyenne
13
ABR : Compléxité de rechercher
niveau 0 niveau 1 niveau 2 niveau 3
• hauteur d’un ABR = niveau max
• hauteur d’un noeud
h(x) = 0 si x est la racine h(x) = 1+ h(y), y = pere(x)
•
hauteur d’un ABR B : h(B) = max{h(x), x nœud de B}(h =3)
14
ABR : Compléxité de rechercher
Si tous les nœuds de l’arbre existent : ABR plein
Si tous les nœuds existent sauf ceux du dernier niveau :
niveaumin ABR
15
Conséquence : pour un ABR plein avec N noeuds la compléxité de Rech_abr:
meilleur cas ………… O(1) Pire cas ………… O(log N)
en moyenne ………… ???
ABR : Compléxité de rechercher
16
ABR : Compléxité de rechercher
compléxité en moyenne pour une recherche dans
un ABR plein est une fonction logarithmique du nombre de nœuds de l’arbre
Complexité en moyenne pour des ABR quelconque
est approximativement 39% plus chère que la recherche dans un ABR plein pour le même nombres de nœuds :
3 log
386 .
1 )
( N 2 N
T avg
17
• Maintenant que nous connaissons la
compléxité de Rech_abr que peuton dire des autres opérations?
ABR : compléxité de rechercher
Insertion ………… O(log N) Suppression ………… O(log N) Trouver le Min ………… O(log N) Trouver le Max ………… O(log N) Tri ABR = ………… O(N log N)
Idée: ABR tri = (Construction de l’ABR : N insertions)
+ (Parcourir ABR)
18
• En résumé, il est nécessaire d’avoir un ABR plein ou niveau-min ABR
garder un arbre le plus équilibré possible à tout moment (Arbre AVL)
ABR : Compléxité de rechercher
19
Arbre AVL
• Arbre AVL (AdelsonVelskii et Landis):
– Le meilleur ABR maintenant à tout moment un arbre raisonnablement équilibré.
– Idée : si l’insertion ou la suppression provoque un déséquilibre de l’arbre, rétablir l’équilibre.
– Toutes les opérations insertion, suppression,…
sur un arbre AVL avec N noeuds en O(log N)
(en moyenne et dans le pire cas!)
20
AVL Trees
Arbre AVL (propriété): c’est un ABR tq. la différence des hauteurs du sous-arbre gauche et droit de la racine est d’au plus 1 et les sous-arbres gauche et droit sont des AVL
Exemple:
21
Arbres AVL
Facteur d’équilibre d’un nœud :
léger déséquilibre à gauche léger déséquilibre à droite
équilibré
déséquilibre droit déséquilibre gauche
h(g) - h(d) = +1 h(g) - h(d)
= -1
h(g) - h(d) = -2 h(g) - h(d) = +2 h(g)-h(d)= 0
22
Arbres AVL
Exemples :
0
1
1
0
0 0
0 0
0 +1
+2
+1
-1 -2
23
Arbres AVL
Un arbre AVL n’est ni un arbre plein ni un arbre niveau-min.
Insertions et suppressions sont éffectuées de la même manière
que pour les ABR. Après chaque opération,
on a besion de vérifier la propriété d’AVL!. Car l’arbre peut ne plus l’être!0
h diffère de 2!
nouveau noeuds
0
0 0
0 0
2
1
1 0
0
24
Arbres AVL
Après une insertion, si l’arbre est un AVL alors on ne fait rien.
Comme sur l’exemple ci-dessous :
0 1 -1
0 0 1
0 0
0
1 0
0 1
25
Arbres AVL
Quand une insertion provoque le déséquilibre de l’arbre?
26
Arbres AVL : insertion d’un noeud
L’arbre devient déséquilibré si l’élément ajouté est le descendant gauche (droit) d’un nœud avec un léger
déséquilibre gauche (droit). Alors la hauteur de ce sous-arbre augmente.
Dans les figures suivantes, on note :
U: nouveaux nœuds pouvant déséquilibrer l’arbre
B: nouveaux laissant l’arbre équilibré
27
Arbres AVL: Insertion
U B B
B B B B
U U U
U U U U
U U
U
U
28
Arbres AVL: Insertion
Noter que l’insertion d’un nœud peut provoquer des déséquilibres sur plusieurs nœuds.
Déséquilibre par insertion
propriété AVL n’est plus
respectée.
nouveau noeud
29
Arbres AVL: Insertion
Cas I: rotation Droite ou rotation Gauche
q
V
W V
U
U q
p
P
W
30
Arbres AVL: Insertion
Cas I: rotation Droite ou rotation Gauche
void RD(Arbre a){
Arbre tmp= g(a);
a->g = g(tmp);
tmp->d= a;
a= tmp;
}
void RG(Arbre a){
Arbre tmp= d(a);
a->d = g(tmp);
tmp>fg= *a;
a= tmp;
}
RDG
RGD
31
V W
P R
q R
q T
p W
U V
T U
Rotations Doubles
32
Arbres AVL: Insertion
void RGD(Arbre *a){
RG( &((*a)->fg) );
RD(a);
}
void RDG(Arbre *a){
RD( &((*a)->fd) );
RG(a);
}
Cas II: nouveau noeud inséré dans T
2Cas II - T2a : Cas II - T2b :
33
Arbres 2.3.4
4 1 13 3 4
15
14 35 5 4
1 3 15
1 3 7 8 11 12 2 28
4 1 13
2noeud 3noeud 4noeud
Définition : Un arbre 2.3.4 est un arbre de recherche dont les nœuds sont de trois types, 2nœud, 3nœud, 4nœud, et dont toutes les feuilles sont situées au même niveau
34
Arbres 2.3.4
• la hauteur reste logarithmique par rapport au nombre de nœuds
– algos de rééquilibrages qui maintiennent un arbre 2.3.4 après ajout ou suppression en effectuant une
suite de rotations sur chemin de la racine à une feuille
• O(log n) pour recherche, ajout et suppression
• implantation efficace sous la forme d’arbres
binaires de recherches bicolores
35
Arbres 2.3.4
Adjonction d ’un élément
L’adjonction d ’un nouvel élément ne pose problème que si la feuille qui doit le recevoir contient déjà 3 éléments.
Dans ce cas, il faut ajouter un nouveau nœud à l ’arbre et le réorganiser.
Adjonction avec éclatement en remonté :
On ajoute successivement 4, 35, 1, 13, 3, 3, 15, 12, 7, 4, 2, 11, 6
Ce nœud ne peut plus contenir de nouveau éléments.
On remarque que du point de vue recherche, M est équivalent à l ’arbre binaire :
Cet arbre est un arbre 2.3.4, on peut y ajouter de nouveaux éléments : 13, puis 3, puis 3
M 4
4 35 M
4 1 35 M
1 M
4 35
36
Arbres 2.3.4
L ’ajout de 15 provoque l ’éclatement de la feuille f en deux 2nœuds contenant respectivement le plus petit et le plus grand élément de f.
L ’élément médian 3 doit être ajouté au nœud père de f, il y a alors de la place pour 15 dans le même nœud que 13 qui devient alors un 3noeud
1
13 35 4
1
13 35 3 4
1
13 3 35
3 4 f
M M M
1 3
13 15 3 4
M
35
1 3
3 4 7 12 13 15 M
35 4
37
Arbres 2.3.4
L ’ajout de 2 entraîne un éclatement de la feuille contenant 12, 13 et 15
L ’adjonction de 6 provoque l ’éclatement de la feuille f, la remonté de 4 fait éclater à son tour la racine de l ’arbre en 2noeuds
=> les éclatements peuvent remonter en cascade sur toute la hauteur de l ’arbre.
1 13 3
3 4 7 15 2 M
12 35 4
1 13 3
3 4 7 15 2
M
35 4 11 12
f
3
15 2 M
35 4 4 1
13
11 12 3 6 7
38
Arbres 2.3.4
• Pour éviter des éclatements de bas en haut, il suffit de travailler sur des arbres qui ne contiennent jamais deux 4nœuds qui se suivent. Dans ce cas toute adjonction provoque au plus un éclatement.
• Ceci peut être réalisé en éclatant les 4nœuds à la descente : Lors de la recherche de la place de l’élément à ajouter, on parcourt un chemin à partir de la racine jusqu ’à une feuille;
seuls les 4nœuds de ce chemin risquent d ’éclater suite à l ’adjonction.
• On prévient ce risque en les faisant éclater, au fur et à mesure de leur rencontre avant de réaliser l ’adjonction. (Ceci provoque parfois des éclatements inutiles)
39
Une représentation des arbres 2.3.4 : les arbres bicolores
• Définition : Un arbre bicolore est un arbre binaire de recherche dont les nœuds portent une information supplémentaire (rouge et noir).
• Les 4nœuds et 3nœuds sont transformé en arbre binaire de recherche.
• Double trait si le lien appartient à un nœud de l ’arbre 2.3.4 (lie des nœuds jumeaux)
• On peut aussi représenter par un double cercle les nœuds vers lesquels « pointent » des doubles traits
a b c
p p1 p2 p3
a b c p p1 p2 p3
b
p p1 p2 p3
a c
b
p p1 p2 p3
a c
b
p p1 p2 p3
a c
40
Une représentation des arbres 2.3.4 : les arbres bicolores
• Pour les 3nœuds, il existe 2 transformations possibles
• Les deux représentations pourront exister à la suite de rotations
• La hauteur de l’arbre bicolore obtenu par ces transformations est au plus 2*la hauteur de l’arbre 2.3.4 initial, augmentée de 1.
• => Tout arbre bicolore associé à un arbre 2.3.4 contenant n éléments a une hauteur de l’ordre O(log n)
a b p p1 p2
a b p p1 p2
a p
p1 p2 b
a p
p1 p2 b
Penché à droite
a b p p1 p2
a b
p p1 p2
b
p2 p p1
a
b p2
p p1 a
Penché à gauche
41
Arbres 2.3.4 /Arbres bicolores
2 25 4 5 6 12 45
43 48 63 65
15 22 24 3 35 38 55 59
3 5 1
8
Représentation en arbre bicolore ?
45
12 5
8 25
3 5
1 2 4
15 24 35 43
48 6
59 63
55 65
22 3 38
42
Arbres 2.3.4 /Arbres bicolores
• On simule l ’adjonction avec éclatement à la descente dans un arbre 2.3.4
• Eclater un 4nœud revient à inverser les couleurs des éléments de ce nœud
• Ceci peut cependant faire apparaître deux nœuds rouges consécutifs, ce qui doit être évité si l ’on veut conserver la propriété de hauteur logarithmique
=> utilisation de transformations locales : rotations
b
p p1 p2 p3
a c
b
p p1 p2 p3
a c
43
Arbres 2.3.4 /Arbres bicolores
Plusieurs situations possibles
1) Le 4nœud à éclater est attaché à un 2nœud
=> une simple inversion de couleur suffit
a a
a
a
44
Arbres 2.3.4 /Arbres bicolores
2) Le 4nœud , E, à éclater est attaché à un 3nœud : 3 cas lorsque le 3nœud est penché à droite
3 cas lorsque le 3nœud est penché à gauche a) E est premier fils du 3nœud
=> on inverse les couleurs des éléments du 4noeud
a
a
a b
a b
b b
45
Arbres 2.3.4 /Arbres bicolores
b) E est second fils du 3nœud
=> une inversion de couleurs entraîne une mauvaise disposition des éléments jumeaux a, et b
=> rotation droitegauche au niveau du nœud contenant a
a
a
a b
a b
b b
a
b
RDG
46
Arbres 2.3.4 /Arbres bicolores
c) E est troisième fils du 3nœud
=> rotation gauche au niveau du nœud contenant a
a
b a
a b
a b
b
a RG
b