Sei sulla pagina 1di 96

Algoritmi e Strutture Dati

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

Permettono di trovare un elemento in tempo O(h)

Nel caso peggiore, h = O(n)

Ma se l'albero bilanciato, h = O(log n)

Cosa significa bilanciato?

Fattore di bilanciamento

Il fattore di bilanciamento (v) di un nodo v la massima


differenza di altezza fra i sottoalberi di v

Esempio: albero perfetto:

(v)=0 per ogni nodo v

Alberto Montresor

Algoritmi di bilanciamento

Alberi AVL (Adel'son-Vel'skii e Landis, 1962)

(v) 1 per ogni nodo v

Bilanciamento ottenuto tramite rotazioni

B-Alberi (Bayer, McCreight, 1972)

(v) = 0 per ogni nodo v

Specializzati per strutture in memoria secondaria

Alberi 2-3 (Hopcroft, 1983)

(v) = 0 per ogni nodo v

Bilanciamento ottenuto tramite merge/split, grado variabile

Alberi Red-Black (Bayer, 1972)

Alberto Montresor

Esempio di rotazioni

T1

Alberto Montresor

T2

v
h+1

h+2

T3

h+1

T1
T2

T3

Alberi Rosso-Nero (Red-Black Treee, RB-Tree)

Un albero rosso-nero un albero binario di ricerca in cui:

Ogni nodo colorato di rosso o di nero

Le chiavi vengono mantenute solo nei nodi interni dellalbero

Le foglie sono costituite da nodi nil

Un Albero Red-Black deve soddisfare i seguenti vincoli:


1) La radice si considera nera
2) i nodi nil si considerano nodi neri;
3) se un nodo rosso, allora entrambi i suoi figli sono neri;
4) ogni percorso da un nodo interno ad un nodo nil (figlio di una
foglia) ha lo stesso numero di nodi neri

Alberto Montresor

Alberi Red-Black

Ogni nodo mantiene

parent

left, right

color

key, data

puntatore al genitore
puntatori ai figli sinistro/destro
colore
chiave e dati

Nodo nil

nodo sentinella che evita di trattare diversamente i puntatori ai


nodi dai puntatori nil

al posto di un puntatore nil, si usa un puntatore ad un nodo nil

ne esiste solo uno, per risparmiare memoria

nodo con figli nil foglia nell'ABR corrispondente

Alberto Montresor

Alberi Red-Black: esempio I


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

30

Vincolo 3 impone che non


possano esserci due nodi
ROSSI adiacenti.
(Ma pi nodi NERI possono
essere adiacenti)

15

Nil

Nil
Nil

60

20

10
5

70

Nil

Nil
40

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

Alberi Red-Black: esempio I


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Ci sono 3 nodi neri lungo ogni


percorso dalla radice al nodo
NIL

30

15

Nil

Nil
Nil

60

20

10
5

70

Nil

Nil
40

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

Alberi Red-Black: esempio I


Questo anche
un albero AVL

3 Se un nodo rosso, allora


entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

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

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


9

Alberi Red-Black: esempio II


Questo ancora
un albero Red-Black

3 Se un nodo rosso, allora


entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

30

15
60

20

10
Nil

70

Nil

Nil

Nil
40

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

10

Alberi Red-Black: esempio II


Ma NON un
albero AVL!

3 Se un nodo rosso, allora


entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

altezza 1

15

2 livelli

70
60

20

10
Nil

30

Nil

Nil

Nil
40

50

altezza 3
85

65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

11

Alberi Red-Black: esempio I


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Albero RB con 3 nodi neri


lungo ogni percorso dalla
radice al nodo NIL

30

15

Nil

Nil
Nil

60

20

10
5

70

Nil

Nil
40

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

12

Alberi Red-Black: esempio III


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Albero RB con 3 nodi neri


lungo ogni percorso dalla
radice al nodo NIL

30

15

Nil

Nil
Nil

60

20

10
5

70

Nil

Nil
40

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

13

Alberi Red-Black: esempio IV


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Albero RB con 3 nodi neri


lungo ogni percorso dalla
radice al nodo NIL

30

15
60

20

10
Nil

70

Nil

Nil

Nil
Nil

Alberto Montresor

50

85
65

80

90

Nil Nil Nil Nil Nil Nil Nil


14

Alberi Red-Black: esempio V


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Stesso albero con 2 nodi neri


lungo ogni percorso dalla
radice al nodo NIL

30

15
60

20

10
Nil

70

Nil

Nil

Nil
Nil

Alberto Montresor

50

85
65

80

90

Nil Nil Nil Nil Nil Nil Nil


15

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Questo albero pu essere un


albero RB?

30

15
60

20

10
Nil

70

Nil

Nil

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


Alberto Montresor

16

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 ci possono


essere al pi 3 nodi neri lungo
un percorso!

30

15
60

20

10
Nil

70

Nil

Nil

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


Alberto Montresor

17

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 ci possono


essere al pi 3 nodi neri lungo
un percorso!

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

Nil Nil Nil Nil


18

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 ci possono


essere al pi 3 nodi neri lungo
un percorso!

30

15

Nil

Quindi uno di questi


due nodi deve essere
rosso
Alberto Montresor

60

20

10
Nil

70

Nil

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


19

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 ci possono


essere al pi 3 nodi neri lungo
un percorso!

30

15

Nil

Nil

Esistono due percorsi


con 2 soli nodi neri
Alberto Montresor

60

20

10
Nil

70

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


20

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 ci possono


essere al pi 3 nodi neri lungo
un percorso!

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

Nil Nil Nil Nil


21

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 ci possono


essere al pi 3 nodi neri lungo
un percorso!

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

Nil Nil Nil Nil


22

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 e il vincolo 3, ci


possono essere al pi 2 nodi
neri lungo un percorso!

30

15
60

20

10
Nil

70

Nil

Nil

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


Alberto Montresor

23

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 e il vincolo 3, ci


possono essere al pi 2 nodi
neri lungo un percorso!

30

15
60

20

10
Nil

70

Nil

Questa sarebbe
lunica possibilit!

Nil

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


Alberto Montresor

24

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Per vincolo 4 e il vincolo 3, ci


possono essere al pi 2 nodi
neri lungo un percorso!

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

Nil Nil Nil Nil


25

Alberi Red-Black: esempio VI


3 Se un nodo rosso, allora
entrambi i suoi figli sono neri;
4 Ogni percorso da un nodo
interno ad un nodo NIL ha lo
stesso numero di nodi neri.

Questo albero NON pu essere


un albero Red-Black!

30

15

Nil

Nil

A meno che lalbero non


venga ristrutturato (tramite
rotazioni)
Alberto Montresor

60

20

10
Nil

70

Nil
40

85
Nil

50

Nil Nil

55

Nil Nil Nil Nil


26

Alberi Red-Black

Definizione:

Definizione:

Laltezza nera di un albero RB laltezza nera della sua radice

Domanda 9.1

Il numero di nodi neri lungo ogni percorso da un nodo v (escluso)


ad una foglia detto altezza nera di v, indicato bh(v)

Dimostrare che l'altezza massima di un albero RB 2 log (n+1)

Da cui segue:

Le operazioni di ricerca hanno costo O(log n)

Cosa succede per le operazioni di modifica?

Alberto Montresor

27

Inserimenti

Durante la costruzione di un albero Red-Black:

possibile che le condizioni di bilanciamento risultino violate.

Quando le propriet Red-Black vengono violate si pu agire:

modificando i colori nella zona della violazione;

operando dei ribilanciamenti dellalbero tramite rotazioni:

Alberto Montresor

Rotazione destra

Rotazione sinistra

28

Rotazione a sinistra

Rotazione da sinistra a destra

Opera sul figlio destro


Padre del
sottoalbero

x
y

Alberto Montresor

29

Rotazione a sinistra

Rotazione da sinistra a destra

Opera sul figlio destro


Padre del
sottoalbero

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

Il codice per la right-rotation simmetrico

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

Il codice per la right-rotation simmetrico

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

Il codice per la right-rotation simmetrico

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

Il codice per la right-rotation simmetrico

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

Il codice per la right-rotation simmetrico

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

Il codice per la right-rotation simmetrico

Alberto Montresor

Padre del
sottoalbero

y
x

Assunzione:
v.right NIL

36

Inserimento in alberi Red-Black

Inserimento

Ricerca della posizione usando la stessa procedura usata per gli


alberi binari di ricerca

Coloriamo il nuovo nodo di rosso

Ci spostiamo verso lalto lungo il percorso di inserimento

per ripristinare la propriet 3 (red-black)


spostando le violazioni verso lalto rispettando il vincolo 4
(mantenendo laltezza nera dellalbero)

Al termine, coloriamo la radice di nero

Nota

Le operazioni di ripristino sono necessarie solo quando due nodi


consecutivi sono rossi!

Alberto Montresor

37

Inserimento in alberi Red-Black

Se la radice sempre nera, non si presenta mai la necessit di


ribilanciare lalbero lungo percorsi che contengono meno di tre
nodi!
Non si possono, infatti, verificare violazioni!

5
Nil

Nodo da inserire
Alberto Montresor

5
Nil

3
Nil

Radice

Radice
3
Nil
6

6
Nil

Nil

Nil
38

Ribilanciamenti: casi 1-3

C
A

D
B

caso 1

Caso 1: lo zio y di x rosso

Alberto Montresor

x il nodo modificato che provoca lo


sbilanciamento Red-Black
y il figlio del padre del padre di x

39

Ribilanciamenti: casi 1-3

C
A

D
B

Alberto Montresor

C
A

caso 1

caso 2

Caso 2: lo zio y di x nero


x un figlio destro

La radice di
y nera

40

Ribilanciamenti: casi 1-3

C
A

D
B

Alberto Montresor

Caso 3: lo zio y di x nero


x un figlio sinistro

C
A

caso 1

caso 2

caso 3

La radice di
y nera

y
La radice di
y nera
41

Inserimento in alberi RB: Caso 1


Caso 1: lo zio y di x rosso
Tutti i sono sottoalberi di
uguale altezza nera

Cambiamo i colori di alcuni nodi, preservando


vincolo 4: tutti i percorsi sotto a questi nodi
hanno altezza nera uguale. Poi si continua verso
lalto facendo del padre del padre di x il nuovo x

caso 1

Alberto Montresor

D
B

42

Inserimento in alberi RB: Caso 1


y = x.parent.parent.right // zio
IF y.color = RED
THEN x.parent.color = BLACK
y.color = BLACK
x.parent.parent.color = RED
x = x.parent.parent

Caso 1: lo zio y di x rosso


Tutti i sono sottoalberi di
uguale altezza nera

C
A

D
B

Cambiamo i colori di alcuni nodi, preservando vincolo 4:


tutti i percorsi sotto a questi nodi hanno altezza nera uguale.
Poi si continua verso lalto facendo del padre del padre di x il nuovo x
Alberto Montresor

43

Inserimento in alberi RB: Caso 1


y = x.parent.parent.right // zio
IF y.color = RED
THEN x.parent.color = BLACK
y.color = BLACK
x.parent.parent.color = RED
x = x.parent.parent

C
D
B

Tutti i sono sottoalberi di


uguale altezza nera

caso 1

Caso 1: lo zio y di x rosso

D
B

Cambiamo i colori di alcuni nodi, preservando vincolo 4:


tutti i percorsi sotto a questi nodi hanno altezza nera uguale.
Poi si continua verso lalto facendo del padre del padre di x il nuovo x
Alberto Montresor

44

Inserimento in alberi RB: Caso 1


y = x.parent.parent.right // zio
IF y.color = RED
THEN x.parent.color = BLACK
y.color = BLACK
x.parent.parent.color = RED
x = x.parent.parent

C
D
B

caso 1

Poich il padre di C pu essere


rosso, pu essere necessario
ripristinare la propriet RB pi
in alto

Cambiamo i colori di alcuni nodi, preservando vincolo 4:


tutti i percorsi sotto a questi nodi hanno altezza nera uguale.
Poi si continua verso lalto facendo del padre del padre di x il nuovo x
Alberto Montresor

45

Inserimento in alberi RB: Caso 1


y = x.parent.parent.right // zio
IF y.color = RED
THEN x.parent.color = BLACK
y.color = BLACK
x.parent.parent.color = RED
x = x.parent.parent

Alberto Montresor

caso 1

A
B

Si eseguono le stesse
azioni sia quando x un
figlio sinistro o un figlio
destro

46

Inserimento in alberi RB: Caso 2


Caso 2:
lo zio y di x nero
x un figlio destro
Trasformiamo nel caso 3 con
una rotazione sinistra

Trasformiamo il caso 2 nel caso 3 (x figlio


sinistro) con una rotazione sinistra. Ci
preserva il vincolo 4: tutti i percorsi sotto x
contengonolo stesso numero di nodi neri

Alberto Montresor

caso 2

47

Inserimento in alberi RB: Caso 2


Caso 2:
lo zio y di x nero
x un figlio destro
Trasformiamo nel caso 3 con
una rotazione sinistra

IF x = x.parent.right
THEN x = x.parent
left-rotation(x)
// continua con caso 3

caso 2

Trasformiamo il caso 2 nel caso 3 (x figlio sinistro) con una


rotazione sinistra. Ci preserva il vincolo 4: tutti i percorsi sotto x
contengonolo stesso numero di nodi neri
Alberto Montresor

48

Inserimento in alberi RB: Caso 2


Caso 2:
lo zio y di x nero
x un figlio destro
Trasformiamo nel caso 3 con
una rotazione sinistra

IF x = x.parent.right
THEN x = x.parent
left-rotation(x)
// continua con caso 3

C
A

caso 2

Trasformiamo il caso 2 nel caso 3 (x figlio sinistro) con una


rotazione sinistra. Ci preserva il vincolo 4: tutti i percorsi sotto x
contengonolo stesso numero di nodi neri
Alberto Montresor

49

Inserimento in alberi RB: Caso 3


Caso 3:
lo zio y di x nero
x un figlio sinistro
Cambiare colori e rotazione
destra

Eseguiamo alcuni cambi di colore e facciamo una


rotazione destra. Di nuovo, preserviamo il vincolo
4: tutti i percorsi sotto x contengono lo stesso
numero di nodi neri.

B
A

Alberto Montresor

caso 3
x

50

Inserimento in alberi RB: Caso 3


Caso 3:
lo zio y di x nero
x un figlio sinistro
Cambiare colori e rotazione
destra

x.parent = BLACK
x.parent.parent = RED
right-rotation(x.parent.parent)

B
A

Alberto Montresor

caso 3

Questa radice
nera

Eseguiamo alcuni cambi di colore e facciamo una rotazione


destra. Di nuovo, preserviamo il vincolo 4: tutti i
percorsi sotto x contengono lo stesso numero di nodi neri.

51

Inserimento in alberi RB: Caso 3


Caso 3:
lo zio y di x nero
x un figlio sinistro
Cambiare colori e rotazione
destra

x.parent = BLACK
x.parent.parent = RED
right-rotation(x.parent.parent)

B
A

Alberto Montresor

caso 3

Questa radice
nera

Eseguiamo alcuni cambi di colore e facciamo una rotazione


destra. Di nuovo, preserviamo il vincolo 4: tutti i
percorsi sotto x contengono lo stesso numero di nodi neri.

52

Inserimento in alberi RB: casi 4-6

Casi 1-3

Si applicano nel caso il padre di x sia un figlio sinistro

Casi 4-6

Si applicano nel caso il padre di x sia un figlio destro

Sono simmetrici (si scambia sinistro con destro e viceversa)

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

Inserimento in alberi Red-Black: I

Il padre BLACK, il nuovo


nodo x diventa ROSSO

30

15
60

20

10
Nil

70

Nil

Nil
x

Nil
40

16

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil

Nil Nil
Alberto Montresor

55

Inserimento in alberi Red-Black: I

Il padre nero, il nuovo


nodo x diventa rosso
Nessun Cambiamento

30

15
10
Nil

70

Nil

16
Nil Nil

Non cambia laltezza nera


di nessun nodo!

Alberto Montresor

60

20

Nil
40

50

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


56

Inserimento in alberi Red-Black: II

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

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


57

Inserimento in alberi Red-Black: II

Il padre rosso, il
nuovo nodo rosso

30

Caso I: Lo zio di x rosso

15
60

20

10
Nil

70

Nil

Vincolo 3 violato

Nil

Nil
x

50

40

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil 42 Nil Nil


Nil Nil
Alberto Montresor

58

Inserimento in alberi Red-Black: II

Il padre rosso, il
nuovo nodo rosso

30

Caso I: Lo zio di x rosso

15
60

20

10
Nil

70

Nil

Nil

Coloriamo di nero padre di x


Coloriamo di nero lo zio di x
Coloriamo di rosso il padre
del padre di x

Nil
x

50

40

85
65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil 42 Nil Nil


Nil Nil
Alberto Montresor

59

Inserimento in alberi Red-Black: II

Il padre rosso, il
nuovo nodo rosso

30

Caso I: Lo zio di x rosso

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

55 Nil Nil Nil Nil Nil Nil

Nil 42 Nil Nil


Nil Nil

60

Inserimento in alberi Red-Black: II

Il padre rosso, il
nuovo nodo rosso

30

Caso III: Lo zio di x nero

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

55 Nil Nil Nil Nil Nil Nil

Nil 42 Nil Nil


Nil Nil

Alberto Montresor

85

61

Inserimento in alberi Red-Black: II

Se il padre ROSSO, il
nuovo nodo ROSSO

30

Caso III: Lo zio di x nero

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

Nil 42 Nil Nil


Nil Nil

Alberto Montresor

55 Nil Nil Nil Nil Nil Nil

62

Inserimento in alberi Red-Black: II


Se il padre ROSSO, il
nuovo nodo ROSSO

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

Nil 42 Nil Nil Nil Nil 80


Nil Nil

90

Nil Nil Nil Nil


63

Inserimento in alberi Red-Black: II

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

Nil 42 Nil Nil Nil Nil 80


Nil Nil

Alberto Montresor

90

Nil Nil Nil Nil


64

Cancellazione in RB

Lalgoritmo di cancellazione per alberi RB costruito


sullalgoritmo di cancellazione per alberi binari di ricerca

Useremo una variante con delle sentinelle Nil[T], una per ogni
nodo NIL, per semplificare lalgoritmo

Dopo la cancellazione si deve decidere se necessario


ribilanciare o meno
Le operazioni di ripristino del bilanciamento sono necessarie solo
quando il nodo cancellato nero! (perch?)

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

Se il nodo cancellato y rosso

altezza nera invariata

non sono stati creati nodi rossi consecutivi

la radice resta nera

Se il nodo cancellato y nero

possiamo violare il vincolo 1: la radice pu essere un nodo rosso


possiamo violare il vincolo 3: se il parent e uno dei figli del nodo
cancellato erano rossi
abbiamo violato il vincolo 4: altezza nera cambiata

Lalgoritmo RB-Fix-Cancella(T,x) ripristina la propriet Red-Black


con rotazioni e cambiamenti di colore:

ci sono 4 casi possibili (e 4 simmetrici)

Alberto Montresor

68

Il nodo x (cio A nellesempio) bordato di


rosso ad indicare che il nodo con un
nero in pi da aggiungere (e ridistribuire)
nellalbero

Cancellazione in RB
Caso 1 : fratello rosso, padre nero

Caso 2 : fratello nero con figli neri


B c

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

Cancellazione in RB: Caso 1


B
x

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

Cancellazione in RB: Caso 2


B c
x

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

Cancellazione in RB: Caso 3


B c
x

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

Cancellazione in RB: Caso 4


B c
x

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

Cancellazione in RB: casi

Abbiamo visto i 4 casi possibili quando il nodo x che sostituisce y


(cancellato) un figlio sinistro
Esistono anche i 4 casi simmetrici (con destro e sinistro
scambiati) quando x figlio destro

Alberto Montresor

74

Cancellazione in RB: algoritmo Fix

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

Cancellazione in RB: esempio

T
30
15

Nil

Nil

70

50

20

10
Nil

60

Nil 40

65

55

85

Nil 42 Nil Nil Nil Nil 80


Nil Nil

Alberto Montresor

90

Nil Nil Nil Nil


76

Cancellazione in RB: esempio


Il colore di x rosso
non si esegue il WHILE
e si colora x di nero

T
30

15

60

x
10
Nil

Nil

Nil

70

50

20
Nil 42

55

65

85

Nil Nil Nil Nil Nil Nil 80


40
Alberto Montresor

Nil

y
Nil

90

Nil Nil Nil Nil


77

Cancellazione in RB: esempio


Il colore di x rosso
non si esegue il WHILE
e si colora x di nero

Fatto!

T
30

15

60

x
10
Nil

Nil

Nil

70

50

20
Nil 42

55

65

85

Nil Nil Nil Nil Nil Nil 80


40
Alberto Montresor

Nil

y
Nil

90

Nil Nil Nil Nil


78

Cancellazione in RB: esempio II

T
30
15

Nil

Nil

Nil

70

50

20

10

60

Nil 42

55

65

85

Nil Nil Nil Nil Nil Nil 80

90

Nil Nil Nil Nil

Alberto Montresor

79

Cancellazione in RB: esempio II


Caso II
simmetrico

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

Nil Nil Nil Nil


50

Alberto Montresor

80

Cancellazione in RB: esempio II


Caso II
simmetrico

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

Nil Nil Nil Nil


50

Alberto Montresor

81

Cancellazione in RB: esempio II


Il colore di x ora rosso
si esce dal WHILE
e si colora x di nero

T
30

15

Nil

60
20

10
Nil

Nil

55
Nil 42
Nil Nil

Nil

70
65

85

Nil Nil 80

90

Nil Nil Nil Nil


50

Alberto Montresor

82

Cancellazione in RB: esempio II


Il colore di x ora rosso
si esce dal WHILE
e si colora x di nero

Fatto!

T
30

15

Nil

60
20

10
Nil

Nil

55
Nil 42
Nil Nil

Nil

70
65

85

Nil Nil 80

90

Nil Nil Nil Nil


50

Alberto Montresor

83

Cancellazione in RB: esempio III

T
30
15

Nil

Nil
Nil

60

20

10
5

70

Nil

Nil 50
40

z
85

65

80

90

55 Nil Nil Nil Nil Nil Nil

Nil Nil Nil Nil


Alberto Montresor

84

Cancellazione in RB: esempio III

T
30
15

Nil

Nil
Nil

Nil
y
85

Alberto Montresor

60

20

10
5

70

Nil 50
40

90
65

80

x
Nil

55 Nil Nil Nil Nil

Nil Nil Nil Nil


85

Cancellazione in RB: esempio III

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


86

Cancellazione in RB: esempio III

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


87

Cancellazione in RB: esempio III

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


88

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


89

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


90

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


91

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


92

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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

55 Nil Nil Nil Nil

Nil Nil Nil Nil


93

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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 Nil Nil Nil 80

Nil

Nil Nil
94

Cancellazione in RB: esempio III


w.color = x.parent.color
w.parent.color = BLACK
w.left.color = BLACK
right-rotation(x.parent)
x = T

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 Nil Nil Nil 80

Nil

Nil Nil
95

Cancellazione in RB

Loperazione di cancellazione concettualmente complicata!


Ma efficiente:

il caso 4 risolutivo e applica 1 sola rotazione

il caso 3 applica una rotazione e passa nel caso 4

il caso 2 non fa rotazioni e passa in uno qualsiasi dei casi ma


salendo lungo il percorso di cancellazione
il caso 1 fa una rotazione e passa in uno degli altri casi (ma se va
nel caso 2, il caso 2 termina)

Quindi
al massimo vengono eseguite 3 rotazioni
per iterazione del ciclo while

Alberto Montresor

96

Potrebbero piacerti anche