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 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 Alberi Red-Black: esempio I Vincolo 3 impone che non possano esserci due nodi ROSSI adiacenti. 30 (Ma più nodi NERI possono essere adiacenti.) 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. 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 Alberi Red-Black: esempio I Ci sono 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 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 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. altezza 2 Nil 30 15 70 60 20 10 Nil 5 Questo è anche un albero AVL Nil 1 livello di diff. Nil Nil 40 50 altezza 3 85 65 80 90 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. 30 15 60 20 10 Nil 70 Nil Nil Questo è ancora un albero Red-Black Nil 40 50 85 65 80 90 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. altezza 1 30 15 70 60 20 10 Nil Ma NON è un albero AVL! Nil Nil Nil 40 50 altezza 3 85 65 80 90 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 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 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 Alberi Red-Black: esempio III Ci sono 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 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 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 60 20 10 Nil 70 Nil Nil Nil Nil 50 85 65 80 90 Nil Nil Nil Nil Nil Nil Nil 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 ad un nodo NIL 30 15 60 20 10 Nil 70 Nil Nil Nil Nil 50 85 65 80 90 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 60 20 10 Nil 70 Nil Nil Nil 40 85 Nil 50 55 Nil Nil 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 60 20 10 Nil 70 Nil Nil Nil 40 85 Nil 50 55 Nil Nil 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 60 20 10 Nil 70 Nil Impossibile! Perché... Nil Nil 40 85 Nil 50 55 Nil Nil 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 60 20 10 Nil 70 Nil Impossibile! Perché dovremmo violare vincolo 3 Nil Nil 40 85 Nil 50 55 Nil Nil 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 60 20 10 Nil 70 Nil Nil Quindi uno di questi due nodi deve essere rosso Nil 40 85 Nil 50 55 Nil Nil 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 60 20 10 Nil 70 Nil Nil Esistono due percorsi con 2 soli nodi neri Nil 40 85 Nil 50 55 Nil Nil 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 60 20 10 Nil 70 Nil Nil Esiste un percorso con 2 soli nodi neri Nil 40 85 Nil 50 55 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. Per vincolo 4 ci possono essere al più 3 nodi neri lungo un percorso! 30 15 60 20 10 Nil 70 Nil Nil Esiste un percorso con 2 soli nodi neri Nil 50 85 Nil Nil Nil Questo caso è 40 55 impossibile perchè un percorso ha 3 neri 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. 30 Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 15 60 20 10 Nil 70 Nil Nil Nil 40 85 Nil 50 55 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. 30 Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 15 60 20 10 Nil 70 Nil Questa sarebbe l’unica possibilità! Nil Nil 40 85 Nil 50 55 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. 30 Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 15 60 20 10 Nil 70 Nil Impossibile! Perché dovremmo violare vincolo 4 Nil Nil 40 85 Nil 50 55 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 NON può essere un albero RedBlack! 30 15 60 20 10 Nil 70 Nil Nil A meno che l’albero non venga ristrutturato (tramite rotazioni) Nil 40 85 Nil 50 55 Nil Nil 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 bh( x) nodi interni 2 1 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 bh( x) 2 1 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: 2 bh( x ) 1 2 1 0 0 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno bh( x) 2 1 nodi interni 15 bh(x) dove bh(x) è l’altezza nera di x. bh(x)-1 10 20 bh(x) Passo Induttivo: Se x sia interno con 2 figli e 15 bh(x) abbia altezza bh(x)>1 Entrambi i suoi figli avranno bh(x)-1 10 20 bh(x) -1 altezza bh(x) o bh(x)-1 Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno bh( x) 2 1 nodi interni 15 bh(x) dove bh(x) è l’altezza nera di x. bh(x)-1 10 20 bh(x) Passo Induttivo: Sia x nodo interno con 2 figli e abbia altezza > 0 15 bh(x) Entrambi i suoi figli avranno 20 bh(x) -1 altezza nera bh(x) o bh(x)-1 bh(x)-1 10 Entrambi i suoi figli avranno altezza minore di x, quindi possiamo usare ipotesi induttiva Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno bh( x) 2 1 nodi interni 15 bh(x) dove bh(x) è l’altezza nera di x. bh(x)-1 10 20 bh(x) Passo Induttivo: Se x sia interno con 2 figli e abbia altezza >0 15 bh(x) Entrambi i suoi figli avranno 20 bh(x) -1 altezza nera bh(x) o bh(x)-1 bh(x)-1 10 Ogni figlio avrà almeno bh( x)1 2 1 nodi interni Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha al meno bh( x) 2 1 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 bh( x)1 2 1 nodi interni Quindi il sottoalbero con radice x conterrà almeno (2bh( x)1 1) (2bh( x)1 1) 1 (2bh( x) 1) nodi interni Percorso massimo in alberi Red-Black Il sottoalbero con radice x ha quindi al meno bh( x) 2 1 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 bh( x) 2 1 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à n (2bh( x) 1) 2h 2 1 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à n (2 bh( x) 1) 2 h2 1 Portando 1 a sinistra e applicando il logaritmo: log(n 1) h 2 cioè h 2 log(n 1) 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 RedBlack, quando un nuovo nodo viene inserito è 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 dell’albero tramite rotazioni: Rotazione destra e Rotazione sinistra; Alberi Red-Black: Rotazione destra Nodo Padre del sottoalbero key colore x padre sinistro destro y 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 padre sinistro destro x colore 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 Rotazione col figlio destro Rotazione va da destra a sinistra Il libro la chiama Rotazione a Sinistra key colore padre sinistro destro Assunzione: destro[x ] NIL Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] Padre del destro[x ] = sinistro[y ] sottoalbero 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 x y Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] Padre del destro[x ] = sinistro[y ] sottoalbero 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 x y Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] Padre del destro[x ] = sinistro[y ] sottoalbero 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 x y Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] Padre del destro[x ] = sinistro[y ] sottoalbero 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 x y Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] Padre del destro[x ] = sinistro[y ] sottoalbero 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 x y Alberi Red-Black: Rotazione destra Rotazione-destra(T,x : albero-RB) y = destro[x ] destro[x ] = sinistro[y ] Padre del IF sinistro[y ] NIL sottoalbero 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 x y Rotazione-destra(T,x : albero-RB) y Alberi = destro[x ] Red-Black: Rotazione destra destro[x ] = sinistro[y ] IF sinistro[y ] NIL Padre del THEN padre[sinistro[y ]] = x sottoalbero 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 y x Rotazione-destra(T,x : albero-RB) y =Alberi destro[x ] Red-Black: Rotazione destra destro[x ] = sinistro[y ] IF sinistro[y ] NIL Padre del THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] sottoalbero 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 y x Rotazione-destra(T,x : albero-RB) y =Alberi destro[x ] Red-Black: Rotazione destra destro[x ] = sinistro[y ] IF sinistro[y ] NIL Padre del THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] sottoalbero 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 y x Rotazione-destra(T,x : albero-RB) y =Alberi destro[x ] Red-Black: Rotazione destra destro[x ] = sinistro[y ] IF sinistro[y ] NIL Padre del THEN padre[sinistro[y ]] = x padre[y ] = padre[x ] sottoalbero 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 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à RedBlack: 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 3 Nil 5 Nil Nil Nodo da inserire 3 Nil 6 6 Nil Nil Nil Ribilanciamenti: casi 1-3 C caso 1 A A D y B x C B x D y 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 C caso 1 A A B x D y caso 2 C y B x A D y B x C Questa radice è nera Caso 2: il figlio y del padre del padre di x è nero x è un filgio destro Ribilanciamenti: casi 1-3 C caso 1 A A D y B x B x caso 2 A C y B B x D y Caso 3: il figlio y del padre del padre di x è nero x è un filgio sinistro C C La radice di y è nera A x caso 3 y 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 C caso 1 A A D y B x C x 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 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]] C C A D y B x Tutti i sono sottoalberi di uguale altezza nera caso 1 A Caso 1: il figlio y del padre del padre di x è rosso D y 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]] C A D y B x C x caso 1 A Poiché il padre di C può essere rosso, può essere necessario ripristinare la proprietà RB più in alto D y B 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]] C C x A D y Tutti i sono sottoalberi di uguale altezza nera caso 1 A B x Caso 1: il figlio y del padre del padre di x è rosso B D Si eseguono le stesse azioni sia quando x è un figlio sinistro o un figlio destro Inserimento in alberi RB: Caso 2 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 A y B B x C caso 2 A x y 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 IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) // continua con caso 3 C A B x 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 caso 2 y A x y B 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 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 A x y B B C caso 2 A x y 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 Caso 3: • il figlio y del padre del padre di x è nero • x è un filgio sinistro • Cambiare colori e rotazione sinistra C B A x y B caso 3 x A C 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 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 A x y C caso 3 B A x y 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 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 A x y C caso 3 Questa radice è nera B A x y 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 colore[padre[x]] = NERO colore[padre[padre[x]]] = ROSSO rotazione-sinistra(T,padre[padre[x]]) C B A x y Caso 3: • il figlio y del padre del padre di x è nero • x è un filgio sinistro • Cambiare colori e rotazione sinistra B caso 3 Questa radice è nera x A C y 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 Caso I 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 Caso I 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]] Casi II e III 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 Caso I 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]] Caso II ELSE IF x = destro[padre[x]] THEN x = padre[x] rotazione-destra(T,x) Caso III 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: I T Il padre è NERO, il nuovo nodo x diventa ROSSO 30 15 60 20 10 Nil 70 Nil Nil x Nil 40 50 85 65 90 55 Nil Nil Nil Nil Nil Nil 16 Nil Nil Nil Nil Nil Nil 80 Inserimento in alberi Red-Black: I Il padre è NERO, il nuovo nodo x diventa ROSSO Nessun Cambiamento T 30 15 10 Nil 60 20 x Nil 70 16 Nil Nil Nil 40 50 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil Non cambia l’altezza nera di nessun nodo! 80 Inserimento in alberi Red-Black: II T Se il padre è ROSSO, il nuovo nodo è ROSSO 30 15 60 20 10 Nil 70 Nil x Nil 16 Nil Nil 40 50 85 65 90 55 Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil Nil Nil 80 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 60 20 10 Nil 70 Nil Vincolo 3 è violato Nil Nil x 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 60 20 10 Nil 70 Nil •Coloriamo di nero il padre di x Nil Nil x 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 60 20 10 Nil 70 Nil •Coloriamo di nero padre di x •Coloriamo di nero il figlio del padre del padre di x Nil Nil x 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 60 20 10 Nil 70 Nil 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 Nil x 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 20 10 Nil 70 Nil Nil Vincolo 3 è ripristinato Vincolo 4 è ripristinato Il padre del padre di x è il nuovo x 60 x Nil 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 20 10 Nil 70 Nil Vincolo 3 è nuovamente violato tra il nuovo x e suo padre Nil 60 x Nil 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 20 10 Nil 70 Nil Nil •Coloriamo di nero il padre di x 60 x Nil 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 20 10 Nil 70 Nil Nil •Coloriamo di nero il padre di x •Coloriamo di rosso padre del padre di x 60 x Nil 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 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 20 10 Nil 70 Nil Nil •Coloriamo di nero il padre di x •Coloriamo di rosso padre del padre di x •Rorazione sinistra 60 x Nil 50 40 85 65 90 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil 80 Inserimento in alberi Red-Black: II Se il padre è ROSSO, il nuovo nodo è ROSSO 30 x 15 Nil Nil Nil Vincolo 3 è ripristinato Vincolo 4 è ripristinato 60 70 50 20 10 Poiché il padre di x sarà sempre nero, abbiamo finito T Nil 40 55 65 85 Nil 42 Nil Nil Nil Nil 80 Nil Nil 90 Nil Nil Nil Nil Inserimento in alberi Red-Black: II T 30 x 15 20 10 Nil Nil Nil Nil 40 60 70 50 55 65 85 Nil 42 Nil Nil Nil Nil 80 90 L’unico caso un cui si procede a ripristinare verso l’alto è il caso I. Negli altri 2 Nil Nil Nil Nil Nil Nil casi, il padre di x sarà sempre nero, si esce quindi dal WHILE e si termina 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 y è il nodo da eliELSE y = ARB-Successore(z) minare e x è il suo sostituto IF sinistro[y] Nil[T] THEN x = sinistro[y] ELSE x = destro[y] y è sostituito da x IF x Nil[T] THEN padre[x]=padre[y] IF padre[y] = Nil[T] caso III 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 • 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 cambiamenti di colore: • ci sono 4 casi possibili (e 4 simmetrici) Cancellazione in RB Il nodo x (cioè A nell’esempio) è bordato di rosso ad indicare che è il nodo con Caso 1: fratello rosso, padre nero un nero in più da aggiungere (e ridistribuire) nell’albero B x A D w C E Cancellazione in RB Caso 2: fratello nero con figli neri Caso 1: fratello rosso, padre nero B c B x A x D w C E A D w C E Il nodo c (cioè B nell’esempio) può essere sia rosso che nero! Cancellazione in RB Caso 1 : fratello rosso, padre nero Caso 2 : fratello nero con figli neri B c B x A x D w C E A D w C E Caso 3: fratello nero con figlio sin. rosso Caso 4: fratello nero con figlio des. rosso B c x A B c x D w C E A D w C c’ E Cancellazione in RB: caso 1 B x D caso 1 A B D w C A x E E C w • 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 x A caso 2 A D w C E B c D 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 Se si 4arriva dal caso 1, B è sicuramente rosso, WHILE ripristina se è il caso (sedopo il padre era nero) il bilanciamento, quindi il caso 2 non c’è più bisogno di altrimenti si termina. ribilanciare, perché ora B ha un solo nero (il nero in più) e può essere semplicemente colore[w] = ROSSO colorato di nero. x = padre[x] Cancellazione in RB: caso 3 B c x A caso 3 x A D w B c C E C D • 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]] w E Cancellazione in RB: caso 4 B c x c caso 4 A D w C c’ D E B 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) w = destro[padre[x]] colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO rotazione-destra(T,padre[x]) 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 caso I rotazione-destra(T,padre[x]) w = destro[padre[x]] ELSE IF (colore[sinistro[w]] = NERO AND colore[destro[w]] = NERO) THEN colore[w] = ROSSO caso II x = padre[x] ELSE IF colore[destro[w]] = NERO THEN colore[sinistro[w]] = NERO colore[w] = ROSSO caso III rotazione-sinistra(T,w) w = destro[padre[x]] colore[w] = colore[padre[x]] colore[padre[w]] = NERO colore[destro[w]] = NERO caso IV rotazione-destra(T,padre[x]) x = root[T] ELSE {come il THEN ma con destro e sinistro scambiati} colore[x] = NERO Cancellazoine 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 90 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 10 Nil Nil Nil 70 50 20 Nil 42 55 65 85 Nil Nil Nil Nil Nil Nil 80 40 Nil y Nil 90 Nil Nil 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 10 Nil Nil Nil 70 50 20 Nil 42 55 65 85 Nil Nil Nil Nil Nil Nil 80 40 Nil y Nil 90 Nil Nil Nil Nil Cancellazoine in RB: esempio II T 30 15 Nil Nil Nil 70 50 20 10 60 z Nil 42 55 65 85 Nil Nil Nil Nil Nil Nil 80 90 Nil Nil Nil Nil Cancellazoine in RB: esempio II Caso II simmetrico T colore[w] = ROSSO x = padre[x] 30 15 20 10 Nil 60 Nil Nil w 70 55 Nil 42 Nil Nil x Nil 65 85 Nil Nil 80 90 y Nil Nil Nil Nil 50 Cancellazoine in RB: esempio II Caso II simmetrico T colore[w] = ROSSO x = padre[x] 30 15 20 10 Nil Nil Nil w 60 x 55 Nil 42 Nil Nil Nil 70 65 85 Nil Nil 80 90 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 20 10 Nil Nil Nil w 60 x 55 Nil 42 Nil Nil Nil 70 65 85 Nil Nil 80 90 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 20 10 Nil Nil Nil w 60 x 55 Nil 42 Nil Nil Nil 70 65 85 Nil Nil 80 90 y Nil Nil Nil Nil 50 Cancellazoine 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 Cancellazoine in RB: esempio III T 30 15 Nil Nil Nil 60 20 10 5 70 Nil y 85 Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil Nil Nil Nil x Nil Cancellazoine in RB: esempio III T colore[w] = ROSSO x = padre[x] Caso II simmetrico 30 15 Nil Nil Nil 60 20 10 5 70 Nil y 85 Nil 50 40 w 65 90 80 55 Nil Nil Nil Nil Nil Nil Nil Nil x Nil Cancellazoine in RB: esempio III T colore[w] = ROSSO x = padre[x] Caso II simmetrico 30 15 Nil Nil Nil 60 20 10 5 70 Nil y 85 Nil 50 40 w 65 90 80 55 Nil Nil Nil Nil Nil Nil Nil Nil x Nil Cancellazoine in RB: esempio III T colore[w] = ROSSO x = padre[x] Caso II simmetrico 30 15 Nil Nil Nil Nil y 85 x 60 20 10 5 70 Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil 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 30 w 15 Nil 5 Nil Nil Nil y 85 70 x 60 20 10 Caso IV simmetrico Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil 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 30 w 15 Nil 5 Nil Nil Nil y 85 70 x 60 20 10 Caso IV simmetrico Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil 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 30 w 15 Nil 5 Nil Nil Nil y 85 70 x 60 20 10 Caso IV simmetrico Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil 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 30 w 15 Nil 5 Nil Nil Nil y 85 70 x 60 20 10 Caso IV simmetrico Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil 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 30 w 15 Nil 5 Nil Nil Nil y 85 70 x 60 20 10 Caso IV simmetrico Nil 50 40 90 65 80 55 Nil Nil Nil Nil Nil 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 30 w 15 Nil 5 Nil Nil 60 20 10 Nil y 85 Caso IV simmetrico 70 50 Nil 40 x 55 90 65 Nil Nil Nil Nil Nil Nil 80 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 x w 30 15 Nil 5 Nil Nil 60 20 10 Nil y 85 Fatto! 70 50 Nil 40 55 90 65 Nil Nil Nil Nil Nil Nil 80 Nil Nil Nil Cancellazoine in RB • L’operazione 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