Algoritmi e Strutture Dati Alberi Bilanciati: Alberi Red-Black
Alberi Red-Black (alberi rossi-neri) Un Albero Red-Black (rosso-nero) è essenzialmente un albero binario di ricerca in cui: 1 Le chiavi vengono mantenute solo nei nodi interni dell’albero 2 Le foglie sono costituite da nodi NIL, cioè nodi sentinella il cui contenuto è irrilevante e che evitano di trattare diversamente i puntatori ai nodi dai puntatori NIL. In altre parole, al posto di un puntatore NIL si usa un puntatore ad un nodo NIL. Quando un nodo ha come figli nodi NIL, quiel nodo sarebbe una foglia nell’albero binario di ricerca corrispondente.
Alberi Red-Black (alberi rossi-neri) Un Albero Red-Black (rosso-nero) deve soddisfare le seguenti proprietà (vincoli): 1 Ogni nodo è colorato o di rosso o di nero; 2 Per convezione, 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;
Alberi Red-Black (alberi rossi-neri) Un Albero Red-Black (rosso-nero) deve soddisfare le seguenti proprietà (vincoli): 1 Ogni nodo è colorato o di rosso o di nero; 2 Per convezione, 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; Considereremo solo alberi Red-Black in cui la radice è nera.
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 15 70 60 85 20 10 5 Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
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. Vincolo 3 impone che non possano esserci due nodi ROSSI adiacenti. (Ma più nodi NERI possono essere adiacenti.) 30 15 70 60 85 20 10 5 Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Alberi Red-Black: esempio I Ci sono 3 nodi neri lungo ogni percorso dalla radi-ce ad un nodo NIL 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 70 60 85 20 10 5 Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
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. Questo è anche un albero AVL 30 altezza 2 altezza 3 15 70 60 85 20 10 5 Nil Nil 50 65 80 90 Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil 1 livello di diff. Nil Nil Nil Nil
Alberi Red-Black: esempio II 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 70 60 85 20 10 Nil Nil 50 65 80 90 Nil Nil Questo è ancora un albero Red-Black 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Alberi Red-Black: esempio II 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. Ma NON è un albero AVL! 30 altezza 1 altezza 3 15 70 60 85 20 10 Nil Nil Nil 50 65 80 90 Nil 40 55 Nil Nil Nil Nil Nil Nil 2 livelli Nil Nil Nil Nil
Alberi Red-Black: esempio I Ci sono 3 nodi neri lungo ogni percorso dalla radi-ce ad un nodo NIL 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 70 60 85 20 10 5 Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Alberi Red-Black: esempio III Ci sono 3 nodi neri lungo ogni percorso dalla radi-ce ad un nodo NIL 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 70 60 85 20 10 5 Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Alberi Red-Black: esempio IV Albero RB con 3 nodi neri lungo ogni percorso dalla radice ad un nodo NIL 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 70 60 85 20 10 Nil Nil 50 65 80 90 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Alberi Red-Black: esempio V Stesso albero con 2 nodi neri lungo ogni percorso dalla radice ad un nodo NIL 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 70 60 85 20 10 Nil Nil 50 65 80 90 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
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 Red-Black? 30 15 70 60 85 20 10 Nil Nil Nil Nil Nil 50 Nil Nil 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil Nil 50 Nil Nil 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil Impossibile! Perché... 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil Impossibile! Perché dovremmo violare vincolo 3 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil Quindi uno di questi due nodi deve essere rosso 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil 40 55 Esistono due percorsi con 2 soli nodi neri Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil 40 55 Esiste un percorso con 2 soli nodi neri Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil Questo caso è impossibile perchè un percorso ha 3 neri 40 55 Esiste un percorso con 2 soli nodi neri Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil Nil 50 Nil Nil 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil Questa sarebbe l’unica possibilità! 40 55 Nil Nil Nil Nil
Alberi Red-Black: esempio VI Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil Impossibile! Perché dovremmo violare vincolo 4 40 55 Nil Nil Nil Nil
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 70 60 85 20 10 Nil Nil Nil Nil 50 Nil Nil Nil A meno che l’albero non venga ristrutturato (tramite rotazioni) 40 55 Nil Nil Nil Nil
Percorso Nero in alberi Red-Black Definizione: Il numero di nodi neri lungo ogni percorso da un nodo x (escluso) ad una foglia è detto altezza nera di x Definizione: L’altezza nera di un albero Red-Black è l’altezza nera della sua radice.
Percorso massimo in alberi Red-Black Lemma: Un albero Red-Black con n nodi ha altezza al più 2 log(n + 1) Dimostrazione: Iniziamo col dimostrare per induzione che il sottoalbero con radice x ha almeno nodi interni dove bh(x) è l’altezza nera di x. L’induzione sarà sull’altezza di x.
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è l’altezza nera di x. Passo Base: Se x ha altezza 0: allora x è una foglia NIL e quindi contiene almeno:
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è l’altezza nera di x. Passo Induttivo: Se x sia interno con 2 figli e abbia altezza bh(x)>1 Entrambi i suoi figli avranno altezza bh(x) o bh(x)-1 bh(x) 15 bh(x)-1 10 20 bh(x) bh(x) 15 bh(x)-1 10 20 bh(x) -1
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è l’altezza nera di x. Passo Induttivo: Sia x nodo interno con 2 figli e abbia altezza > 0 Entrambi i suoi figli avranno altezza nera bh(x) o bh(x)-1 Entrambi i suoi figli avranno altezza minore di x, quindi possiamo usare ipotesi induttiva bh(x) 15 bh(x)-1 10 20 bh(x) bh(x) 15 bh(x)-1 10 20 bh(x) -1
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è l’altezza nera di x. Passo Induttivo: Se x sia interno con 2 figli e abbia altezza >0 Entrambi i suoi figli avranno altezza nera bh(x) o bh(x)-1 Ogni figlio avrà almeno bh(x) 15 bh(x)-1 10 20 bh(x) bh(x) 15 bh(x)-1 10 20 bh(x) -1
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è l’altezza nera di x. Passo Induttivo: Sia x nodo interno con 2 figli e abbia altezza >0 Ogni figlio avrà almeno Quindi il sottoalbero con radice x conterrà almeno
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha quindi al meno nodi interni dove bh(x) è l’altezza nera di x. Completiamo la dimostrazione del lemma. Sia ora h l’altezza dell’albero. Per il vincolo 3 almeno metà dei nodi lungo ogni percorso (esclusa la radice) sono neri. Quindi l’altezza nera dell’albero dovrà essere almeno h/2 ( cioè bh h/2 ).
Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno nodi interni dove bh(x) è l’altezza nera di x. Completiamo la dimostrazione del lemma. Sia ora h l’altezza dell’albero. Quindi l’altezza nera dell’albero dovrà essere almeno h/2 ( cioè bh h/2 ). Ma allora, il numero di nodi dell’albero sarà
Percorso massimo in alberi Red-Black Lemma: Un albero Red-Black con n nodi ha altezza al più 2 log(n + 1) Dimostrazione: …. Completiamo la dimostrazione del lemma. Sia ora h l’altezza dell’albero. Ma allora, il numero di nodi dell’albero sarà Portando 1 a sinistra e applicando il logaritmo: cioè
Costo operazioni su alberi Red-Black Teorema: In un albero Red-Black le operazioni di ricerca, inserimento e cancellazione hanno costo O(log(n)). Dimostrazione: Conseguenza diretta del Lemma precedente e dal fatto che tutte le operazioni hanno costo O(h), con h l’altezza dell’albero.
Violazione delle proprietà per inserimento Durante la costruzione di un albero Red-Black, quando un nuovo nodo viene inserito è possibile che le condizioni di bilancia-mento risultino violate. Quando le proprietà Red-Black vengono violate si può agire: modificando i colori nella zona della violazione; operando dei ribilanciamenti dell’albero tramite rotazioni: Rotazione destra e Rotazione sinistra;
Alberi Red-Black: Rotazione destra Nodo Padre del sottoalbero key colore x padre y sinistro destro Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra
Alberi Red-Black: Rotazione destra Nodo Padre del sottoalbero key y colore padre x sinistro destro Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra
Alberi Red-Black: Rotazione destra Nodo Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y key colore padre sinistro destro Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra Assunzione: destro[x ] NIL
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Padre del sottoalbero x y
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra Padre del sottoalbero y x
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra Padre del sottoalbero y x
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra Padre del sottoalbero y x
Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] IF sinistro[y ] NIL THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] IF padre[x ] = NIL THEN root[T ] = y ELSE IF x = sinistro[padre[x ]] THEN sinistro[padre[x ]] = y ELSE destro[padre[x ]] = y sinistro[y ] = x padre[x ] = y Alberi Red-Black: Rotazione destra Padre del sottoalbero y x
Inserimento in alberi Red-Black Inseriamo un nuovo nodo x usando la stessa procedura usata per gli alberi binari di ricerca Coloriamo il nuovo nodo di rosso Ci spostiamo verso l’alto lungo il percorso di inserimento per ripristinare la proprietà Red-Black: spostiamo le violazioni verso l’alto rispettando il vincolo 4 (mantenendo l’altezza nera dell’albero) Al termine, coloriamo la radice di nero. Le operazioni di ripristino sono necessarie solo quando due nodi consecutivi sono rossi!
Inserimento in alberi Red-Black Le operazioni di ripristino sono necessarie solo quando due nodi consecutivi sono rossi! Se la radice è sempre nera, non si presenta mai la necessità di ribilanciare l’albero lungo percorsi che contengono meno di tre nodi! Non si possono, infatti, verificare violazioni! Radice Radice 5 5 3 Nil 3 6 Nil Nil Nil Nil Nil Nil Nodo da inserire 6
Ribilanciamenti: casi 1-3 caso 1 A D A D y y B x B x Caso 1: il figlio y del padre del padre di x è rosso x è il nodo modificato che provoca lo sbilanciamento Red-Black y è il figlio del padre del padre di x
Ribilanciamenti: casi 1-3 caso 1 A D A D y y B x B x C caso 2 A y Caso 2: il figlio y del padre del padre di x è nero x è un filgio destro B x Questa radice è nera
Ribilanciamenti: casi 1-3 caso 1 A D A D y y B x B x Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro C caso 2 caso 3 C A y B y B x A x La radice di y è nera La radice di y è nera
Inserimento in alberi RB: Caso 1 Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera x C C caso 1 A D y A D B x 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 l’alto facendo del padre del padre di x il nuovo x
Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera C A D y B x Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto a questi nodi hanno altezza nera uguale. Poi si continua verso l’alto facendo del padre del padre di x il nuovo x
Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera C C caso 1 A D y A D y B x B x Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto hanno altezza nera uguale. Poi si continua verso l’alto facendo del padre del padre di x il nuovo x
Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] Poiché il padre di C può essere rosso, può essere necessario ripri-stinare la proprietà RB più in alto x C C caso 1 A D y A D y B B x Cambiamo i colori di alcuni nodi, preservando vincolo 4: tutti i percorsi sotto hanno altezza nera uguale. Poi si continua verso l’alto facendo del padre del padre di x il nuovo x
Inserimento in alberi RB: Caso 1 y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] Caso 1: il figlio y del padre del padre di x è rosso Tutti i sono sottoalberi di uguale altezza nera C C x caso 1 A D y A D B x B Si eseguono le stesse azioni sia quando x è un figlio sinistro o un figlio destro
Inserimento in alberi RB: Caso 2 il figlio y del padre del padre di x è nero x è un filgio destro Trasformiamo nel caso 3 con una rotazione destra C C caso 2 A y B y B x A x Trasformiamo il caso 2 nel caso 3 (x è figlio sinistro) con una rotazione destra. Ciò preserva il vincolo 4: tutti i percorsi sotto x contengonolo stesso numero di nodi neri
Inserimento in alberi RB: Caso 2 il figlio y del padre del padre di x è nero x è un filgio destro Trasformiamo nel caso 3 con una rotazione destra IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) // continua con caso 3 C C caso 2 A x y A y B B x Trasformiamo il caso 2 nel caso 3 (x è figlio sinistro) con una rotazione destra. Ciò preserva il vincolo 4: tutti i percorsi sotto x contengonolo stesso numero di nodi neri
Inserimento in alberi RB: Caso 2 il figlio y del padre del padre di x è nero x è un filgio destro Trasformiamo nel caso 3 con una rotazione destra IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) // continua con caso 3 C C caso 2 A x y B y B A x Trasformiamo il caso 2 nel caso 3 (x è figlio sinistro) con una rotazione destra. Ciò preserva il vincolo 4: tutti i percorsi sotto x contengonolo stesso numero di nodi neri
Inserimento in alberi RB: Caso 3 il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra C B caso 3 B y x A C A x Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri.
Inserimento in alberi RB: Caso 3 il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) C C caso 3 B B y y A A x x Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri.
Inserimento in alberi RB: Caso 3 il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) C C caso 3 B B y y A x A x Questa radice è nera Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri.
Inserimento in alberi RB: Caso 3 il figlio y del padre del padre di x è nero x è un filgio sinistro Cambiare colori e rotazione sinistra colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) C B caso 3 B y x A C A x y Questa radice è nera Eseguiamo alcuni cambi di colore e facciamo una rotazione sinistra. Di nuovo, preserviamo il vincolo 4: tutti i percorsi sotto x contengono lo stesso numero di nodi neri.
Inserimento in alberi RB: Casi 4-6 I casi 1-3 assumono che il padre di x sia un figlio sinistro Se il padre di x è un figlio destro si applicano i casi 4-6 che sono simmetrici (scambiamo sinistro con destro e viceversa). L’estensione dell’algoritmo ai casi 4-6 è lasciato come esercizio
Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci(T,x) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO
Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci(T,x) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO Caso I
Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci(T,x) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO Caso I Casi II e III
Inserimento in alberi Red-Black RB-Inserisci(T,x : albero-RB) ABR-Inserisci(T,x) colore[x] = ROSSO WHILE (x root[T] AND colore[padre[x]] = ROSSO) DO IF padre[x] = sinistro[padre[padre[x]]] THEN y = destro[padre[padre[x]]] IF colore[y] = ROSSO THEN colore[padre[x]] = NERO colore[y] = NERO colore[padre[padre[y]]] = ROSSO x = padre[padre[x]] ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) ELSE {come il THEN ma con destro e sinistro scambiati} colore[root[T]] = NERO Caso I Caso II Caso III
Inserimento in alberi Red-Black: I Il padre è NERO, il nuovo nodo x diventa ROSSO 30 15 70 60 85 20 10 Nil 80 90 Nil Nil 50 65 Nil x 40 55 Nil Nil Nil Nil Nil Nil 16 Nil Nil Nil Nil Nil Nil
Inserimento in alberi Red-Black: I Il padre è NERO, il nuovo nodo x diventa ROSSO Nessun Cambiamento T 30 15 70 60 85 20 10 x Nil 50 65 80 90 Nil 16 Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Non cambia l’altezza nera di nessun nodo!
Inserimento in alberi Red-Black: II Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 Nil 80 90 Nil 16 50 65 Nil x Nil Nil 40 55 Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso I: L’altro figlio del padre del padre di x è rosso T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 Nil 80 90 Nil Nil 50 65 Nil Vincolo 3 è violato 40 55 Nil Nil Nil Nil Nil Nil x Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso I: L’altro figlio del padre del padre di x è rosso T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 Nil 80 90 Nil Nil 50 65 Nil 40 55 Nil Nil Nil Nil Nil Nil Coloriamo di nero il padre di x x Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso I: L’altro figlio del padre del padre di x è rosso T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 Nil 80 90 Nil Nil 50 65 Nil Coloriamo di nero padre di x Coloriamo di nero il figlio del padre del padre di x 40 55 Nil Nil Nil Nil Nil Nil x Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso I: L’altro figlio del padre del padre di x è rosso T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 Nil 80 90 Nil Nil 50 65 Nil Coloriamo di nero padre di x Coloriamo di nero il figlio del padre del padre di x Coloriamo di rosso il padre del padre di x 40 55 Nil Nil Nil Nil Nil Nil x Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso I: L’altro figlio del padre del padre di x è rosso T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 x Nil 50 65 80 90 Nil Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Vincolo 3 è ripristinato Vincolo 4 è ripristinato Nil 42 Nil Nil Il padre del padre di x è il nuovo x Nil Nil
Inserimento in alberi Red-Black: II Caso III: L’altro figlio del padre del padre di x è nero T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 x Nil 50 65 80 90 Nil Nil Nil Vincolo 3 è nuovamente violato tra il nuovo x e suo padre 40 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso III: L’altro figlio del padre del padre di x è nero T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 x Nil 50 65 80 90 Nil Nil Nil Coloriamo di nero il padre di x 40 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso III: L’altro figlio del padre del padre di x è nero T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 x Nil 50 65 80 90 Nil Nil Nil Coloriamo di nero il padre di x Coloriamo di rosso padre del padre di x 40 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Caso III: L’altro figlio del padre del padre di x è nero T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 70 60 85 20 10 x Nil 50 65 80 90 Nil Nil Nil Coloriamo di nero il padre di x Coloriamo di rosso padre del padre di x Rorazione sinistra 40 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil
Inserimento in alberi Red-Black: II Poiché il padre di x sarà sempre nero, abbiamo finito T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 x 60 70 20 50 10 85 65 40 Nil 55 Nil Nil Nil 80 90 Nil 42 Nil Nil Nil Nil Vincolo 3 è ripristinato Vincolo 4 è ripristinato Nil Nil Nil Nil Nil Nil
Inserimento in alberi Red-Black: II 30 15 x 60 70 20 50 10 85 65 40 Nil 55 Nil Nil Nil 80 90 L’unico caso un cui si procede a ripristinare verso l’alto è il caso I. Negli altri 2 casi, il padre di x sarà sempre nero, si esce quindi dal WHILE e si termina Nil 42 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Cancellazione in RB L’algoritmo di cancellazione per alberi RB è costruito sull’algoritmo di cancellazione per alberi binari di ricerca Useremo una variante con delle sentinelle Nil[T], una per ogni nodo NIL (perché?), per semplificare l’algoritmo 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é?)
Cancellazione in RB RB-Cancella(T,z:albero-RB) IF (sinistro[z] = Nil[T] OR destro[z] = Nil[T]) THEN y = z ELSE y = ARB-Successore(z) IF sinistro[y] Nil[T] THEN x = sinistro[y] ELSE x = destro[y] IF x Nil[T] THEN padre[x]=padre[y] IF padre[y] = Nil[T] THEN Root[T] = x ELSE IF y = sinistro[padre[y]] THEN sinistro[padre[y]]=x ELSE destro[padre[y]]=x IF y z THEN “copia i campi di y in z” IF colore[y ] = NERO THEN RB-Fix-Cancella(T,x) return y
Cancellazione in RB casi I e II RB-Cancella(T,z:albero-RB) IF (sinistro[z] = Nil[T] OR destro[z] = Nil[T]) THEN y = z ELSE y = ARB-Successore(z) IF sinistro[y] Nil[T] THEN x = sinistro[y] ELSE x = destro[y] IF x Nil[T] THEN padre[x]=padre[y] IF padre[y] = Nil[T] THEN Root[T] = x ELSE IF y = sinistro[padre[y]] THEN sinistro[padre[y]]=x ELSE destro[padre[y]]=x IF y z THEN “copia i campi di y in z” IF colore[y ] = NERO THEN RB-Fix-Cancella(T,x) return y y è il nodo da eli-minare e x è il suo sostituto y è sostituito da x caso III
Cancellazione in RB Dobbiamo ribilanciare se il nodo cancellato è nero (perché è cambiata l’altezza nera) Possiamo immaginare di colorare di nero il nodo x che sostituisce il nodo cancellato y In tal modo la cancellazione non viola più il vincolo 4 ... … ma potrebbe violare il vincolo 1 (perché?) L’algoritmo RB-Fix-Cancella(T,x) tenta di ripristinare il vincolo 1 con rotazioni e cambia-menti di colore: ci sono 4 casi possibili (e 4 simmetrici)
Caso 1: fratello rosso, padre nero Cancellazione in RB Il nodo x (cioè A nell’esempio) è bordato di rosso ad indicare che è il nodo con un nero in più da aggiungere (e ridistribuire) nell’albero Caso 1: fratello rosso, padre nero B x A D w C E
Caso 1: fratello rosso, padre nero : fratello nero con figli neri Cancellazione in RB Caso 1: fratello rosso, padre nero Caso 2 : fratello nero con figli neri B B c x A D Il nodo c (cioè B nell’esempio) può essere sia rosso che nero! x A D w w C C E E
: fratello rosso, padre nero : fratello nero con figli neri Cancellazione in RB Caso 1 : fratello rosso, padre nero Caso 2 : fratello nero con figli neri B B c x A D x A D w w C C E E B A D C x w E c Caso 3 : fratello nero con figlio sin. rosso B A D C x w E c c’ Caso 4 : fratello nero con figlio des. rosso
Cancellazione in RB: caso 1 D B caso 1 x B E A D w w A x C C E 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 colore[padre[x]] = ROSSO colore[w] = NERO rotazione-destra(T,padre[x]) w = destro[padre[x]]
Cancellazione in RB: caso 2 x B c B c caso 2 x A D w A D C E C E 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ò essere semplicemente colorato di nero. colore[w] = ROSSO x = padre[x]
Cancellazione in RB: caso 3 x A D w x A C w C E D E Il fratello w di x è nero w ha in questo caso solo il figlo sinistro rosso 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 colore[sinistro[w]] = NERO colore[w] = ROSSO rotazione-sinistra(T,w) w = destro[padre[x]]
Cancellazione in RB: caso 4 D caso 4 x A D w B E C c’ E A c’ C Il fratello w di x è nero w ha in questo caso solo il figlo 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! colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO rotazione-destra(T,padre[x]) x = root[T] x = root[T ]
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 scembiati) quando x è figlio destro Esercizio: Illustrare i 4 casi simmetrici e scrivere lo pseudo-codice che li gestisce
Cancellazione in RB: algoritmo Fix RB-Fix-Cancella(T,x : albero-RB) WHILE x root[T] AND colore[x] = NERO DO IF x = sinistro[padre[x]] THEN w = destro[padre[x]] IF colore[w] = ROSSO THEN colore[padre[x]] = ROSSO colore[w] = NERO rotazione-destra(T,padre[x]) w = destro[padre[x]] ELSE IF (colore[sinistro[w]] = NERO AND colore[destro[w]] = NERO) THEN colore[w] = ROSSO x = padre[x] ELSE IF colore[destro[w]] = NERO THEN colore[sinistro[w]] = NERO colore[w] = ROSSO rotazione-sinistra(T,w) colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO x = root[T] ELSE {come il THEN ma con destro e sinistro scambiati} colore[x] = NERO
Cancellazione in RB: algoritmo Fix RB-Fix-Cancella(T,x : albero-RB) WHILE x root[T] AND colore[x] = NERO DO IF x = sinistro[padre[x]] THEN w = destro[padre[x]] IF colore[w] = ROSSO THEN colore[padre[x]] = ROSSO colore[w] = NERO rotazione-destra(T,padre[x]) w = destro[padre[x]] ELSE IF (colore[sinistro[w]] = NERO AND colore[destro[w]] = NERO) THEN colore[w] = ROSSO x = padre[x] ELSE IF colore[destro[w]] = NERO THEN colore[sinistro[w]] = NERO colore[w] = ROSSO rotazione-sinistra(T,w) colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO x = root[T] ELSE {come il THEN ma con destro e sinistro scambiati} colore[x] = NERO caso I caso II caso III caso IV
Cancellazoine in RB: esempio T 30 15 60 70 20 50 10 85 65 40 Nil 55 Nil Nil Nil 42 80 90 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil z
Cancellazoine in RB: esempio Il colore di x è rosso non si esegue il WHILE e si colora x di nero T 30 15 60 x 70 20 50 10 85 42 65 Nil 55 Nil Nil Nil 80 90 Nil Nil Nil Nil Nil Nil 40 Nil Nil Nil Nil y Nil Nil
Cancellazoine 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 70 20 50 10 85 42 65 Nil 55 Nil Nil Nil 80 90 Nil Nil Nil Nil Nil Nil 40 Nil Nil Nil Nil y Nil Nil
Cancellazoine in RB: esempio II T 30 15 60 z 70 20 50 10 85 42 65 Nil 55 Nil Nil Nil 80 90 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Cancellazoine in RB: esempio II Caso II simmetrico T colore[w] = ROSSO x = padre[x] 30 15 60 70 20 10 w 55 x 85 42 65 Nil Nil Nil Nil Nil 80 90 Nil Nil Nil Nil y Nil Nil Nil Nil 50
Cancellazoine in RB: esempio II Caso II simmetrico T colore[w] = ROSSO x = padre[x] 30 15 w 60 x 70 20 10 55 85 42 65 Nil Nil Nil Nil Nil 80 90 Nil Nil Nil Nil y Nil Nil Nil Nil 50
Cancellazoine in RB: esempio II Il colore di x è ora rosso si esce dal WHILE e si colora x di nero T 30 15 w 60 x 70 20 10 55 85 42 65 Nil Nil Nil Nil Nil 80 90 Nil Nil Nil Nil y Nil Nil Nil Nil 50
Cancellazoine in RB: esempio II Il colore di x è ora rosso si esce dal WHILE e si colora x di nero Fatto! T 30 15 w 60 x 70 20 10 55 85 42 65 Nil Nil Nil Nil Nil 80 90 Nil Nil Nil Nil y Nil Nil Nil Nil 50
Cancellazoine in RB: esempio III T 30 15 70 z 60 85 10 20 5 Nil 50 65 80 90 Nil Nil 40 Nil Nil 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil
Cancellazoine in RB: esempio III T 30 15 70 60 20 90 10 x 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III T Caso II simmetrico colore[w] = ROSSO x = padre[x] 30 15 70 60 90 10 20 w x 5 80 Nil 50 65 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III T Caso II simmetrico colore[w] = ROSSO x = padre[x] 30 15 70 60 90 10 20 w x 5 80 Nil 50 65 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III T Caso II simmetrico colore[w] = ROSSO x = padre[x] 30 15 70 x 60 10 20 90 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T Caso IV simmetrico 30 15 70 w x 60 10 20 90 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T Caso IV simmetrico 30 15 70 w x 60 10 20 90 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T Caso IV simmetrico 30 15 70 w x 60 10 20 90 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T Caso IV simmetrico 30 15 70 w x 60 10 20 90 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T Caso IV simmetrico 30 15 70 w x 60 10 20 90 5 Nil 50 65 80 Nil Nil Nil y 40 Nil Nil 55 Nil Nil Nil Nil 85 Nil Nil Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T Caso IV simmetrico 30 w 15 60 70 10 20 50 x 5 Nil Nil Nil 40 55 65 90 y Nil Nil Nil Nil Nil Nil 80 Nil Nil Nil 85 Nil Nil
Cancellazoine in RB: esempio III colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[sinistro[w]] = NERO rotazione-sinistra(T,padre[x]) x = root[T] T x Fatto! 30 w 15 60 70 10 20 50 5 Nil Nil Nil 40 55 65 90 y Nil Nil Nil Nil Nil Nil 80 Nil Nil Nil 85 Nil Nil
al massimo vengono eseguite 3 rotazioni Cancellazoine in RB L’operazione di cancellazione è concettual-mente 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