Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Alberi Bilanciati
Alberi Red-Black
Alberto Montresor
Universit di Trento
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view
a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative
Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
Alberto Montresor
Introduzione
Alberi di ricerca
Fattore di bilanciamento
Alberto Montresor
Algoritmi di bilanciamento
Alberto Montresor
Esempio di rotazioni
T1
Alberto Montresor
T2
v
h+1
h+2
T3
h+1
T1
T2
T3
Alberto Montresor
Alberi Red-Black
parent
left, right
color
key, data
puntatore al genitore
puntatori ai figli sinistro/destro
colore
chiave e dati
Nodo nil
Alberto Montresor
30
15
Nil
Nil
Nil
60
20
10
5
70
Nil
Nil
40
50
85
65
80
90
30
15
Nil
Nil
Nil
60
20
10
5
70
Nil
Nil
40
50
85
65
80
90
altezza 2
15
Nil
Nil
Nil
1 livello di diff.
Alberto Montresor
70
60
20
10
5
30
Nil
Nil
40
50
altezza 3
85
65
80
90
30
15
60
20
10
Nil
70
Nil
Nil
Nil
40
50
85
65
80
90
10
altezza 1
15
2 livelli
70
60
20
10
Nil
30
Nil
Nil
Nil
40
50
altezza 3
85
65
80
90
11
30
15
Nil
Nil
Nil
60
20
10
5
70
Nil
Nil
40
50
85
65
80
90
12
30
15
Nil
Nil
Nil
60
20
10
5
70
Nil
Nil
40
50
85
65
80
90
13
30
15
60
20
10
Nil
70
Nil
Nil
Nil
Nil
Alberto Montresor
50
85
65
80
90
30
15
60
20
10
Nil
70
Nil
Nil
Nil
Nil
Alberto Montresor
50
85
65
80
90
30
15
60
20
10
Nil
70
Nil
Nil
Nil
40
85
Nil
50
Nil Nil
55
16
30
15
60
20
10
Nil
70
Nil
Nil
Nil
40
85
Nil
50
Nil Nil
55
17
30
15
Nil
Impossibile!
Perch dovremmo
violare vincolo 3
Alberto Montresor
60
20
10
Nil
70
Nil
Nil
40
85
Nil
50
Nil Nil
55
30
15
Nil
60
20
10
Nil
70
Nil
Nil
40
85
Nil
50
Nil Nil
55
30
15
Nil
Nil
60
20
10
Nil
70
Nil
40
85
Nil
50
Nil Nil
55
30
15
Nil
Esiste un percorso
con 2 soli nodi neri
Alberto Montresor
60
20
10
Nil
70
Nil
Nil
40
85
Nil
50
Nil Nil
55
30
15
Nil
Esiste un percorso
con 2 soli nodi neri
Alberto Montresor
60
20
10
Nil
70
Nil
Nil
40
85
Nil
50
55
Nil Nil
Questo caso
impossibile perch
un percorso ha 3 neri
30
15
60
20
10
Nil
70
Nil
Nil
Nil
40
85
Nil
50
Nil Nil
55
23
30
15
60
20
10
Nil
70
Nil
Questa sarebbe
lunica possibilit!
Nil
Nil
40
85
Nil
50
Nil Nil
55
24
30
15
Nil
Impossibile!
Perch dovremmo
violare vincolo 4
Alberto Montresor
60
20
10
Nil
70
Nil
Nil
40
85
Nil
50
Nil Nil
55
30
15
Nil
Nil
60
20
10
Nil
70
Nil
40
85
Nil
50
Nil Nil
55
Alberi Red-Black
Definizione:
Definizione:
Domanda 9.1
Da cui segue:
Alberto Montresor
27
Inserimenti
Alberto Montresor
Rotazione destra
Rotazione sinistra
28
Rotazione a sinistra
x
y
Alberto Montresor
29
Rotazione a sinistra
y
x
Alberto Montresor
30
Rotazione a sinistra
left-rotation(x)
y = x.right
x.right = y.left
IF y.left NIL
THEN y.left.parent = x
y.parent = x.parent
IF x.parent NIL
IF x = x.parent.left
THEN x.parent.left = y
ELSE x.parent.right = y
y.left = x
x.parent = y
return y // The new root of this
// subtree
Alberto Montresor
Padre del
sottoalbero
x
y
Assunzione:
v.right NIL
31
Rotazione a sinistra
left-rotation(x)
y = x.right
x.right = y.left
IF y.left NIL
THEN y.left.parent = x
y.parent = x.parent
IF x.parent NIL
IF x = x.parent.left
THEN x.parent.left = y
ELSE x.parent.right = y
y.left = x
x.parent = y
return y // The new root of this
// subtree
Alberto Montresor
Padre del
sottoalbero
x
y
Assunzione:
v.right NIL
32
Rotazione a sinistra
left-rotation(x)
y = x.right
x.right = y.left
IF y.left NIL
THEN y.left.parent = x
y.parent = x.parent
IF x.parent NIL
IF x = x.parent.left
THEN x.parent.left = y
ELSE x.parent.right = y
y.left = x
x.parent = y
return y // The new root of this
// subtree
Alberto Montresor
Padre del
sottoalbero
x
y
Assunzione:
v.right NIL
33
Rotazione a sinistra
left-rotation(x)
y = x.right
x.right = y.left
IF y.left NIL
THEN y.left.parent = x
y.parent = x.parent
IF x.parent NIL
IF x = x.parent.left
THEN x.parent.left = y
ELSE x.parent.right = y
y.left = x
x.parent = y
return y // The new root of this
// subtree
Alberto Montresor
Padre del
sottoalbero
x
y
Assunzione:
v.right NIL
34
Rotazione a sinistra
left-rotation(x)
y = x.right
x.right = y.left
IF y.left NIL
THEN y.left.parent = x
y.parent = x.parent
IF x.parent NIL
IF x = x.parent.left
THEN x.parent.left = y
ELSE x.parent.right = y
y.left = x
x.parent = y
return y // The new root of this
// subtree
Alberto Montresor
Padre del
sottoalbero
x
y
Assunzione:
v.right NIL
35
Rotazione a sinistra
left-rotation(x)
y = x.right
x.right = y.left
IF y.left != NIL
THEN y.left.parent = x
y.parent = x.parent
IF x.parent != NIL
IF x = x.parent.left
THEN x.parent.left = y
ELSE x.parent.right = y
y.left = x
x.parent = y
return y // The new root of this
// subtree
Alberto Montresor
Padre del
sottoalbero
y
x
Assunzione:
v.right NIL
36
Inserimento
Nota
Alberto Montresor
37
5
Nil
Nodo da inserire
Alberto Montresor
5
Nil
3
Nil
Radice
Radice
3
Nil
6
6
Nil
Nil
Nil
38
C
A
D
B
caso 1
Alberto Montresor
39
C
A
D
B
Alberto Montresor
C
A
caso 1
caso 2
La radice di
y nera
40
C
A
D
B
Alberto Montresor
C
A
caso 1
caso 2
caso 3
La radice di
y nera
y
La radice di
y nera
41
caso 1
Alberto Montresor
D
B
42
C
A
D
B
43
C
D
B
caso 1
D
B
44
C
D
B
caso 1
45
Alberto Montresor
caso 1
A
B
Si eseguono le stesse
azioni sia quando x un
figlio sinistro o un figlio
destro
46
Alberto Montresor
caso 2
47
IF x = x.parent.right
THEN x = x.parent
left-rotation(x)
// continua con caso 3
caso 2
48
IF x = x.parent.right
THEN x = x.parent
left-rotation(x)
// continua con caso 3
C
A
caso 2
49
B
A
Alberto Montresor
caso 3
x
50
x.parent = BLACK
x.parent.parent = RED
right-rotation(x.parent.parent)
B
A
Alberto Montresor
caso 3
Questa radice
nera
51
x.parent = BLACK
x.parent.parent = RED
right-rotation(x.parent.parent)
B
A
Alberto Montresor
caso 3
Questa radice
nera
52
Casi 1-3
Casi 4-6
Per esercizio
Alberto Montresor
53
RB-Insert(T,x
)
Inserimento
in alberi Red-Black
ABR-Insert(T,x)
x.color = RED
WHILE (x != T AND x.parent.color = RED) DO
IF x.parent = x.parent.parent.left
THEN
Caso I
x.parent.parent.right;
IF y.color = RED THEN
x.parent.color = BLACK
y.color = BLACK
y.parent.parent.color = RED
x = x.parent.parent
ELSE
IF x = x.parent.right THEN
Caso II
x = x.parent
right-rotation(x)
x.parent.color = BLACK
x.parent.parent.color = RED
Caso III left-rotation(x.parent.parent)
ELSE
{come il THEN ma con destro e sinistro scambiati}
if (x = T) x.color = BLACK
Casi 4-6
Alberto Montresor
54
30
15
60
20
10
Nil
70
Nil
Nil
x
Nil
40
16
50
85
65
80
90
Nil Nil
Alberto Montresor
55
30
15
10
Nil
70
Nil
16
Nil Nil
Alberto Montresor
60
20
Nil
40
50
85
65
80
90
Il padre rosso, il
nuovo nodo rosso
30
15
70
Nil
60
20
10
Nil
16
Nil
50
85
65
80
90
x
42
Nil Nil
Alberto Montresor
Nil
Nil
40
Il padre rosso, il
nuovo nodo rosso
30
15
60
20
10
Nil
70
Nil
Vincolo 3 violato
Nil
Nil
x
50
40
85
65
80
90
58
Il padre rosso, il
nuovo nodo rosso
30
15
60
20
10
Nil
70
Nil
Nil
Nil
x
50
40
85
65
80
90
59
Il padre rosso, il
nuovo nodo rosso
30
15
Nil
Vincolo 3 ripristinato
Vincolo 4 ripristinato
Il padre del padre
di x il nuovo x
Alberto Montresor
Nil
60
20
10
Nil
70
Nil
50
40
85
65
80
90
60
Il padre rosso, il
nuovo nodo rosso
30
15
Nil
Vincolo 3
nuovamente violato
tra il nuovo x
e suo padre
Nil
60
20
10
Nil
70
Nil
50
40
65
80
90
Alberto Montresor
85
61
Se il padre ROSSO, il
nuovo nodo ROSSO
30
15
Nil
Coloriamo di nero il
padre di x
Coloriamo di rosso
padre del padre di x
Rotazione sinistra
Nil
60
20
10
Nil
70
Nil
50
85
65
80
90
40
Alberto Montresor
62
30
x
15
Nil
Vincolo 3 ripristinato
Vincolo 4 ripristinato
Alberto Montresor
Nil
60
70
50
20
10
Nil
Poich il padre di x
sar sempre nero,
abbiamo finito
Nil 40
55
65
85
90
T
Lunico caso un cui si procede a
ripristinare verso lalto il caso
I. Negli altri 2 casi, il padre di x
sar sempre nero, si esce
15 quindi
dal WHILE e si termina
Nil
Nil
60
70
50
20
10
Nil
30
Nil 40
55
65
85
Alberto Montresor
90
Cancellazione in RB
Useremo una variante con delle sentinelle Nil[T], una per ogni
nodo NIL, per semplificare lalgoritmo
Alberto Montresor
65
Cancellazione in RB
// Elimina il nodo radice
ABR delete(ABR T)
// y: nodo da eliminare
if T.left = nil or T.right = nil
then y := T
else y := T.successor()
// x: nodo per short-cut
if y.left != nil
then x := y.left
else x := y.right
// Effettua lo short-cut
// Non si effettua test sul nil; se x nil, il suo
// parent viene modificato comunque
x.parent = y.parent
[Continua]
Alberto Montresor
66
Cancellazione in RB
if y.parent = nil then
return x
// Nodo da eliminare radice
else
if y=y.parent.left
then y.parent.left := x
else y.parent.right := x
// Copia i campi se successore
if y != T then
T.key := y.key
T.data := y.data
if y.color = BLACK then RB-Fix-Cancella(T,x)
return y
Alberto Montresor
67
Cancellazione in RB
Alberto Montresor
68
Cancellazione in RB
Caso 1 : fratello rosso, padre nero
B
x
D w
C
Il nodo c pu essere
sia rosso che nero!
D w
C
Caso 3: fratello nero con figlio sin. rosso Caso 4: fratello nero con figlio des. rosso
B c
x
D w
C
Alberto Montresor
B c
D w
C c
E
69
caso 1
D w
C
A x
E
C
Il fratello w di x rosso
w deve avere figli neri
cambiamo i colori di w e del padre di x e li ruotiamo tra loro
Non violiamo n il vincolo 3 n il 4 e ci riduciamo ad uno degli altri casi
x.parent.color = RED
w.color = BLACK
left-rotation(x.parent)
w = x.parent.right
Alberto Montresor
70
caso 2
D w
C
B c
A
E
D
C
Il fratello w di x nero
w ha in questo caso entrambi i figli neri
cambiamo il colore di w e il nuovo x diventa il padre
Spostiamo il nero in pi da x al nuovo x (il padre) e togliamo il nero da w per
rispettare vincolo 4
WHILE ripristina se il caso (se il padre era nero) il bilanciamento, altrimenti
si termina.
Se si arriva dal caso 1, B sicuramente rosso, quindi
dopo il caso 2 non c pi bisogno di ribilanciare,
perch ora B ha un solo nero (il nero in pi) e pu
w.color = RED
x = x.parent
essere semplicemente colorato di nero.
Alberto Montresor
71
caso 3
x
D w
C
B c
A
D
E
Il fratello w di x nero
w ha il figlio sinistro rosso, il figlio destro nero
cambiamo il colore del sinistro di w e cambiamo quello di w
ruotiamo w col suo figlio sinistro
Non violiamo alcun vincolo (3 e 4) e il nuovo fratello si x ora nero
con figlio sinistro nero, quindi ci portiamo nel caso 4
w.left.color = BLACK
w.color = RED
right-rotation(w)
w = x.parent.right
Alberto Montresor
72
caso 4
D w
C c
B
E
E
c
Il fratello w di x nero
w ha in questo caso solo il figlio destro rosso
cambiamo i colori opportunamente e con una rotazione del
padre di x con w si elimina il nero in pi su x
Non violiamo alcun vincolo (3 e 4) e abbiamo finito!
w.colore = x.parent.color
w.parent.color = BLACK
w.right.color = BLACK
left-rotation(x.parent)
x = T
Alberto Montresor
x=T
73
Alberto Montresor
74
RB-Fix-Cancella(T,x)
WHILE x T AND x.color = BLACK DO
IF x = x.parent.left
THEN w = x.parent.right
IF w.color = RED
THEN x.parent.color = RED
w.color = BLACK
caso I
left-rotation(x.parent)
w = x.parent.right
ELSE IF (w.left.color = BLACK AND w.right.color = BLACK)
THEN w.color = RED
caso II
x = x.parent
ELSE IF w.color.right = BLACK
THEN w.left.color = BLACK
w.color = RED
right-rotation(w)
caso III
w = x.parent.right
w.color = x.parent.color
w.parent.color = BLACK
w.right.color = BLACK
caso IV
left-rotation(x.parent)
x = T
ELSE {come il THEN ma con destro e sinistro scambiati}
colore[x] = NERO
Alberto Montresor
75
T
30
15
Nil
Nil
70
50
20
10
Nil
60
Nil 40
65
55
85
Alberto Montresor
90
T
30
15
60
x
10
Nil
Nil
Nil
70
50
20
Nil 42
55
65
85
Nil
y
Nil
90
Fatto!
T
30
15
60
x
10
Nil
Nil
Nil
70
50
20
Nil 42
55
65
85
Nil
y
Nil
90
T
30
15
Nil
Nil
Nil
70
50
20
10
60
Nil 42
55
65
85
90
Alberto Montresor
79
w.colore = ROSSO
x = x.parent
30
15
20
10
Nil
60
Nil
Nil
w
Nil 42
Nil Nil
y
70
55
x
Nil
65
85
Nil Nil 80
90
Alberto Montresor
80
x.color = ROSSO
x = x.parent
30
15
Nil
60
20
10
Nil
Nil
55
Nil 42
Nil Nil
Nil
70
65
85
Nil Nil 80
90
Alberto Montresor
81
T
30
15
Nil
60
20
10
Nil
Nil
55
Nil 42
Nil Nil
Nil
70
65
85
Nil Nil 80
90
Alberto Montresor
82
Fatto!
T
30
15
Nil
60
20
10
Nil
Nil
55
Nil 42
Nil Nil
Nil
70
65
85
Nil Nil 80
90
Alberto Montresor
83
T
30
15
Nil
Nil
Nil
60
20
10
5
70
Nil
Nil 50
40
z
85
65
80
90
84
T
30
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
60
20
10
5
70
Nil 50
40
90
65
80
x
Nil
w.color = RED
x = x.parent
Caso II
simmetrico
30
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
60
20
10
5
70
Nil 50
40
w
65
90
80
x
Nil
w.color = RED
x = x.parent
Caso II
simmetrico
30
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
60
20
10
5
70
Nil 50
40
w
65
90
80
x
Nil
w.color = RED
x = x.parent
Caso II
simmetrico
30
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
60
20
10
5
70
Nil 50
40
90
65
80
Nil
T
30
w
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
70
60
20
10
5
Caso IV
simmetrico
Nil 50
40
90
65
80
Nil
T
30
w
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
70
60
20
10
5
Caso IV
simmetrico
Nil 50
40
90
65
80
Nil
T
30
w
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
70
60
20
10
5
Caso IV
simmetrico
Nil 50
40
90
65
80
Nil
T
30
w
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
70
60
20
10
5
Caso IV
simmetrico
Nil 50
40
90
65
80
Nil
T
30
w
15
Nil
Nil
Nil
Nil
y
85
Alberto Montresor
70
60
20
10
5
Caso IV
simmetrico
Nil 50
40
90
65
80
Nil
T
30
15
Nil
5
Nil
Nil
Nil
y
85
Alberto Montresor
60
20
10
Caso IV
simmetrico
70
50
Nil 40
x
55
90
65
Nil
Nil Nil
94
x
w
30
15
Nil
5
Nil
Nil
Nil
y
85
Alberto Montresor
60
20
10
Fatto!
70
50
Nil 40
55
90
65
Nil
Nil Nil
95
Cancellazione in RB
Quindi
al massimo vengono eseguite 3 rotazioni
per iterazione del ciclo while
Alberto Montresor
96