Algoritmi e Strutture Dati Alberi binari di ricerca 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
Insieme dinamico che implementa le seguenti funzionalità Dizionari Dizionario Insieme dinamico che implementa le seguenti funzionalità Item lookup(Item k) insert(Item k, Item v) remove(Item k) Esempi di implementazione Array ordinato Ricerca O(log n), inserimento/cancellazione O(n) Lista non ordinata Ricerca/cancellazione O(n), inserimento O(1) © Alberto Montresor
Alberi binari di ricerca (ABR) Idea “ispiratrice” Portare l'idea di ricerca binaria in un albero Definizione Ogni nodo u contiene una chiave u.key associata ad un valore u.value Le chiavi appartengono ad un insieme totalmente ordinato Proprietà Le chiavi dei nodi del sottoalbero sinistro di u sono minori di u.key Le chiavi dei nodi del sottoalbero destro di u sono maggiori di u.key 10 6 15 4 8 12 18 © Alberto Montresor
Alberi binari di ricerca (ABR) Proprietà di ricerca Le proprietà 1. e 2. permettono di realizzare un algoritmo di ricerca dicotomica Domanda – Proprietà di ordine Come devo visitare l'albero per ottenere la lista ordinata dei valori? Dettagli implementativi Ogni nodo deve mantenere Figlio sinistro, destro Padre Chiave Valore Figlio sinistro Padre destro Key, Value © Alberto Montresor
Alberi binari di ricerca: Specifica Operazioni ammesse su ABR Tree key() Tree value() Tree left() Tree right() Tree parent() Tree lookup(Item k) Tree insert(Item k, Item d) Tree delete() Tree successorNode(Item T) Tree predecessorNode(Item T) Tree min() Tree max() © Alberto Montresor
4 sta nel sottoalbero sinistro di 6 T Ricerca: esempio Ricerca del valore 4 4 < 6 4 sta nel sottoalbero sinistro di 6 T 6 2 8 1 4 3 © Alberto Montresor
4 sta nel sottoalbero destro di 2 T Ricerca: esempio Ricerca del valore 4 4 > 2 4 sta nel sottoalbero destro di 2 T 6 2 8 1 4 3 © Alberto Montresor
Ricerca: esempio Ricerca del valore 4 4 = 4 trovato! T 6 2 8 1 4 3 © Alberto Montresor
Ricerca: Implementazione Ricorsiva Iterativa © Alberto Montresor
Ricerca del minimo e del massimo: Esempi Sottoalbero con radice 2: - minimo 1 - massimo 4 Sottoalbero con radice 8: - minimo 8 - massimo 15 T 6 2 8 1 4 4 12 3 9 15 © Alberto Montresor
Ricerca del minimo e del massimo: Pseudo-codice © Alberto Montresor
Ricerca del successore/predecessore Definizione Il successore di un nodo u è il più piccolo nodo maggiore di u Due casi u ha un figlio destro Il successore u' è il minimo del sottoalbero destro di u Esempio: successore di 2 è 3 T 6 u 2 8 1 4 12 9 15 3 u' © Alberto Montresor
Ricerca del successore/predecessore Definizione Il successore di un nodo u è il più piccolo nodo maggiore di u Due casi u non ha un figlio destro Il successore è il primo avo u' tale per cui u sta nel sottoalbero sinistro di u' Esempio: successore di 4 è 6 T u' 6 2 8 1 3 12 4 9 15 u © Alberto Montresor
Ricerca del successore: Pseudo-codice (iterativo) © Alberto Montresor
Ricerca: costo computazionale In generale Le operazioni di ricerca sono confinate ai nodi posizionati lungo un singolo percorso (path) dalla radice ad una foglia Tempo di ricerca: O(h) Domanda Qual è il caso pessimo? Qual è il caso ottimo? h = altezza dell’albero Caso pessimo: l'albero è organizzato come una sequenza lineare di valori crescenti o decrescenti. il costo è lineare nella dimensione dell'albero (O(n)) Caso ottimo: l'albero è completo, o anche solo bilanciato (ovvero la differenza fra il livello del nodo minimo e il livello del nodo massimo differisce al più di una quantità costante. In questo caso, l'altezza dell'albero è O(log n) © Alberto Montresor
Inserimento 5 < 6 Inserimento valore 5 5 > 2 T 5 > 4 6 4 2 8 1 4 4 12 3 5 9 15 © Alberto Montresor
Inserimento: pseudo-codice (iterativo) © Alberto Montresor
Inserimento: pseudo-codice (iterativo) © Alberto Montresor
Caso 1: Il nodo u da eliminare non ha figli Semplicemente si elimina Cancellazione Caso 1: Il nodo u da eliminare non ha figli Semplicemente si elimina Esempio: Eliminazione nodo 5 T 6 2 8 1 4 4 12 3 5 9 15 u © Alberto Montresor
Caso 2: Il nodo u da eliminare ha un unico figlio f Si elimina u Cancellazione Caso 2: Il nodo u da eliminare ha un unico figlio f Si elimina u Si attacca f all'ex-padre p di u in sostituzione di u (short-cut) Esempio: Cancellazione di 4 T 6 2 p 8 1 4 12 u 3 9 15 f © Alberto Montresor
Caso 3: Il nodo u da eliminare ha due figli Cancellazione Caso 3: Il nodo u da eliminare ha due figli Si individua il successore s del nodo u Il successore non ha figlio sinistro Si “stacca” il successore Si attacca l'eventuale figlio destro di s al padre di s (short-cut) Si copia s su u Si rimuove il nodo s T 7 2 u 8 3 1 5 12 s 3 6 9 15 4 © Alberto Montresor
Cancellazione: Pseudo-codice © Alberto Montresor
Cancellazione – Dimostrazione di correttezza Caso 1 - nessun figlio Eliminare foglie non cambia la proprietà di ordine dei nodi rimanenti Caso 2 - solo un figlio (destro o sinistro) Se u è il figlio destro (sinistro) di p, tutti i i valori nel sottoalbero di f sono maggiori (minori) di p Quindi f può essere attaccato come figlio destro (sinistro) di p al posto di u Caso 3 - due figli Il successore s è sicuramente maggiore di tutti i nodi del sottoalbero sinistro di u è sicuramente minore di tutti i nodi del sottoalbero destro di u Quindi può essere sostituito a u © Alberto Montresor
Modifica: costo computazionale In generale Le operazioni di modifica sono confinate ai nodi posizionati lungo un singolo percorso (path) dalla radice ad una foglia Tempo di ricerca: O(h) h = altezza dell’albero Caso pessimo: l'albero è organizzato come una sequenza lineare di valori crescenti o decrescenti. il costo è lineare nella dimensione dell'albero (O(n)) Caso ottimo: l'albero è completo, o anche solo bilanciato (ovvero la differenza fra il livello del nodo minimo e il livello del nodo massimo differisce al più di una quantità costante. In questo caso, l'altezza dell'albero è O(log n) © Alberto Montresor
Qual è l'altezza media di un albero di ricerca? Complessità media Qual è l'altezza media di un albero di ricerca? Caso generale (inserimenti + cancellazione) Difficile da trattare Caso “semplice”: inserimenti in ordine casuale E' possibile dimostrare che l'altezza media è O(log n) 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 In generale: Sono necessarie tecniche per mantenere bilanciato l'albero © 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) Bilanciamento ottenuto tramite merge/split, grado variabile B-alberi binari (Andersson, 1993) Alberi Red-Black (Bayer, 1972) © Alberto Montresor
Esempio di rotazione v u u T3 T1 v T2 T3 T1 T2 © Alberto Montresor
Alberi Rosso-Nero (Red-Black Treee, RB-Tree) Un albero Red-Black è un albero binario di ricerca in cui: Ogni nodo è colorato di rosso o di nero Le chiavi vengono mantenute solo nei nodi interni dell’albero Le foglie sono costituite da nodi nil Un albero Red-Black deve soddisfare i seguenti vincoli: La radice è nera Tutte le foglie sono nere Entrambi i figli di un nodo rosso sono neri Tutti i cammini semplici da ogni nodo u ad una delle foglie contenute nel sottoalbero radicato in u hanno lo stesso numero di nodi neri © Alberto Montresor
parent puntatore al padre Alberi Red-Black Ogni nodo mantiene parent puntatore al padre left, right puntatori ai figli sinistro/destro color colore key, data chiave e dati Nodo Nil nodo sentinella il cui scopo è evitare 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 Definizione: Il numero di nodi neri lungo ogni percorso da un nodo v (escluso) ad ogni foglia (inclusa) del suo sottoalbero è detto altezza nera di v, indicato b(v) Ben definito perché tutti i percorsi hanno lo stesso numero di nodi neri (regola 4) L’altezza nera di un albero Red-Black è pari all’altezza nera della sua radice © Alberto Montresor
Alberi Red-Black: esempio I 3. Entrambi i figli di un nodo rosso sono neri. Ma un nodo nero può avere figli neri! 30 15 70 60 85 20 10 5 Nil Nil Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: esempio I 4. Ogni percorso da un nodo interno ad un nodo Nil ha lo stesso numero di nodi neri. Altezza nera di questo albero: 3 30 15 70 60 85 20 10 5 Nil Nil Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: più colorazioni sono possibili Albero Red-Black con 3 nodi neri lungo ogni percorso dalla radice ai nodi Nil 30 15 70 60 85 20 10 5 Nil Nil Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: più colorazioni sono possibili Albero Red-Black con 3 nodi neri lungo ogni percorso dalla radice ai nodi Nil 30 15 70 60 85 20 10 5 Nil Nil Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: colorazione diversa, altezza nera diversa Albero RB con 3 nodi neri lungo ogni percorso dalla radice ai nodi Nil 30 15 70 60 85 20 10 Nil Nil Nil Nil 50 65 80 90 Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: colorazione diversa, altezza nera diversa Stesso albero con 2 nodi neri lungo ogni percorso dalla radice ai nodi Nil 30 15 70 60 85 20 10 Nil Nil Nil Nil 50 65 80 90 Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? 30 15 70 60 20 85 10 Nil Nil Nil Nil Nil Nil Nil 50 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? Per vincolo sull'altezza nera ci possono essere al più 3 nodi neri lungo un percorso! 30 15 70 60 20 85 10 Nil Nil Nil Nil Nil Nil Nil 50 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? La radice è nera. Supponiamo che 60 e 70 siano entrambi neri. 30 15 70 60 85 20 10 Nil Nil Nil Nil Nil Nil Nil 50 Impossibile! Perché dovremmo violare vincolo 3 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? 30 15 70 60 20 85 10 Nil Nil Nil Nil Nil Nil Nil 50 Quindi uno di questi due nodi deve essere rosso 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? Proviamo a colorare di rosso il nodo 60. Esiste un percorso con 2 nodi neri Esiste un percorso con 3 nodi neri 30 Impossibile per il vincolo sulla lunghezza 15 70 60 20 85 10 Nil Nil Nil Nil Nil Nil Nil 50 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? Proviamo a colorare di rosso il nodo 70 30 15 70 60 85 20 10 Nil Nil Nil Nil Nil Nil Nil 50 40 55 Esistono due percorsi con 2 soli nodi neri Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 30 15 70 60 20 85 10 Nil Nil Nil Nil Nil Nil Nil 50 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? Per vincolo 4 e il vincolo 3, ci possono essere al più 2 nodi neri lungo un percorso! 30 15 70 60 20 85 10 Nil Nil Nil Nil Nil Nil Nil 50 Questa sarebbe l’unica possibilità! 40 55 Impossibile! Perché dovremmo violare vincolo 1 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: questo albero può essere un albero RB? Questo albero NON può essere un albero Red-Black! 30 15 70 60 85 20 10 Nil Nil Nil Nil Nil Nil Nil 50 40 55 Nil Nil Nil Nil © Alberto Montresor
Alberi Red-Black: Proprietà Da cui segue: Le operazioni di ricerca hanno costo O(log n) Cosa succede per le operazioni di modifica? © Alberto Montresor
Durante la modifica di un albero Red-Black: Inserimenti Durante la modifica 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 dell’albero tramite rotazioni: Rotazione destra Rotazione sinistra © Alberto Montresor
far diventare B figlio destro di x Rotazione a sinistra p x Operazioni far diventare B figlio destro di x far diventare x il figlio sinistro di y far diventare y figlio di p, il vecchio padre di x A y B C © Alberto Montresor
far diventare B figlio destro di x Rotazione a sinistra p y Operazioni far diventare B figlio destro di x far diventare x il figlio sinistro di y far diventare y figlio di p, il vecchio padre di x x C A B © Alberto Montresor
far diventare B figlio destro di x Rotazione a sinistra p y Operazioni far diventare B figlio destro di x far diventare x il figlio sinistro di y far diventare y figlio di p, il vecchio padre di x x C A B © Alberto Montresor
Inserimento in alberi Red-Black Ricerca della posizione usando la stessa procedura usata per gli alberi binari di ricerca Coloriamo il nuovo nodo di rosso Quale delle quattro proprietà può essere violata? Ripasso: la radice è nera i nodi Nil sono neri; se un nodo è rosso, allora entrambi i suoi figli sono neri; ogni percorso da un nodo interno ad una foglia ha lo stesso numero di nodi neri © Alberto Montresor
Come modificare la insertNode() balanceTree(n) © Alberto Montresor
Inserimento in alberi Red-Black Come sistemare: Ci spostiamo verso l’alto lungo il percorso di inserimento per ripristinare la proprietà 3 (red-black) spostando le violazioni verso l’alto rispettando il vincolo 4 (mantenendo l’altezza nera dell’albero) Al termine, coloriamo la radice di nero Nota Le operazioni di ripristino sono necessarie solo quando due nodi consecutivi sono rossi! © Alberto Montresor
balanceNode(Tree t) Nodi coinvolti n Il nodo inserito t Suo padre p Suo nonno n Suo zio z n p z t © Alberto Montresor
Inserimento - 7 casi possibili Caso 1: Nuovo nodo t non ha padre Primo nodo ad essere inserito o siamo risaliti fino alla radice Si colora t di nero Caso 2 Padre p di t è nero Nessun vincolo violato © Alberto Montresor
Inserimento - 7 casi possibili Caso 1: Nuovo nodo t non ha padre Primo nodo ad essere inserito Si colora t di nero Caso 2 Padre p di t è nero Nessun vincolo violato © Alberto Montresor
Inserimento - 7 casi possibili Caso 3 t rosso p rosso z rosso Se z è rosso, è possibile colorare di nero p, z, e di rosso n. Poiché tutti i cammini che passano per z e p passano per n, la lunghezza dei cammini neri non è cambiata. Il problema può essere ora sul nonno: violato vincolo (1), ovvero n può essere una radice rossa violato vincolo (3), ovvero n rosso può avere un padre rosso. Poniamo t = n, e il ciclo continua. © Alberto Montresor
Inserimento - 7 casi possibili Caso 3 t rosso p rosso z rosso Se z è rosso, è possibile colorare di nero p, z, e di rosso n. Poiché tutti i cammini che passano per z e p passano per n, la lunghezza dei cammini neri non è cambiata. Il problema può essere ora sul nonno: violato vincolo (1), ovvero n può essere una radice rossa violato vincolo (3), ovvero n rosso può avere un padre rosso. Poniamo t = n, e il ciclo continua. © Alberto Montresor
Inserimento - 7 casi possibili Caso 4a,4b t rosso p rosso z nero Si assuma che t sia figlio destro di p e che p sia figlio sinistro di n Una rotazione a sinistra a partire dal nodo p scambia i ruoli di t e p ottenendo il caso (5a), dove i nodi rossi in conflitto sul vincolo (3) sono entrambi figli sinistri dei loro padri I nodi coinvolti nel cambiamento sono p e t, entrambi rossi, quindi la lunghezza dei cammini neri non cambia © Alberto Montresor
Inserimento - 7 casi possibili Caso 4a,4b t rosso p rosso z nero Si assuma che t sia figlio destro di p e che p sia figlio sinistro di n Una rotazione a sinistra a partire dal nodo p scambia i ruoli di t e p ottenendo il caso (5a), dove i nodi rossi in conflitto sul vincolo (3) sono entrambi figli sinistri dei loro padri I nodi coinvolti nel cambiamento sono p e t, entrambi rossi, quindi la lunghezza dei cammini neri non cambia © Alberto Montresor
Inserimento - 7 casi possibili Caso 5a,5b t rosso p rosso z nero Si assuma che t sia figlio sinistro di p e p sia figlio sinistro di n Una rotazione a destra a partire da n ci porta ad una situazione in cui t e n sono figli di p Colorando n di rosso e p di nero ci troviamo in una situazione in cui tutti i vincoli Red-Black sono rispettati in particolare, la lunghezza dei cammini neri che passano per la radice è uguale alla situazione iniziale © Alberto Montresor
Inserimento - 7 casi possibili Caso 5a,5b t rosso p rosso z nero Si assuma che t sia figlio sinistro di p e p sia figlio sinistro di n Una rotazione a destra a partire da n ci porta ad una situazione in cui t e n sono figli di p Colorando n di rosso e p di nero ci troviamo in una situazione in cui tutti i vincoli Red-Black sono rispettati in particolare, la lunghezza dei cammini neri che passano per la radice è uguale alla situazione iniziale © Alberto Montresor
All together, now! © Alberto Montresor
Inserimento in alberi Red-Black 16 30 Nil Nil 15 70 60 85 20 10 Nil Nil Nil Nil 50 65 80 90 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è nero, t è rosso 30 15 70 60 85 20 10 Nil Nil t 16 Nil 50 65 80 90 Nil Nil 40 55 Nil Nil Nil Nil Nil Nil Caso 2: nessun cambiamento Non cambia l’altezza nera di nessun nodo! Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black: x 42 30 Nil Nil 15 70 60 85 20 10 Nil Nil Nil Nil 50 65 80 90 40 55 Nil Nil Nil Nil Nil Nil Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è rosso, t è rosso T 30 15 70 60 85 20 10 n Nil Nil Nil Nil 50 65 80 90 p z Vincolo 3 è violato 40 55 Nil Nil Nil Nil Nil Nil t Caso 3: z è rosso Nil 42 Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è rosso, t è rosso 30 15 70 60 85 20 10 n Nil Nil Nil Nil 50 65 80 90 p z Coloriamo di nero p Coloriamo di nero z Coloriamo di rosso n 40 55 Nil Nil Nil Nil Nil Nil t Nil 42 Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è rosso, t è rosso 30 15 70 60 85 20 10 t Nil Nil Nil Nil 50 65 80 90 Vincolo 3 è ripristinato Altri vincoli mai stati violati 40 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Il padre del padre di t è il nuovo t Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è rosso, t è rosso 30 Caso 5a: z è nero n 15 70 p z 60 85 20 10 t Nil Nil Nil Nil 50 65 80 90 40 55 Nil Nil Nil Nil Nil Nil Vincolo 3 è nuovamente violato tra il nuovo t e suo padre Nil 42 Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è rosso, t è rosso 30 Caso 5a: z è nero 15 70 60 85 20 10 x Nil Nil Nil Nil 50 65 80 90 Coloriamo di nero t Coloriamo di rosso n Rotazione sinistra 40 55 Nil Nil Nil Nil Nil Nil Nil 42 Nil Nil Nil Nil © Alberto Montresor
Inserimento in alberi Red-Black p è rosso, t è rosso 30 Caso 5a: z è nero 15 60 t 70 20 50 10 85 65 Nil Nil Nil 40 Nil 55 Vincolo 3 è ripristinato Altri vincoli mai stati violati Nil 42 Nil Nil Nil Nil 80 90 Nil Nil Nil Nil Nil Nil Abbiamo finito © Alberto Montresor
Inserimento in alberi Red-Black 30 15 60 x 70 20 50 10 85 65 Nil Nil Nil 40 Nil 55 Nil 42 Nil Nil Nil Nil 80 90 L’unico caso un cui si procede a ripristinare verso l’alto è il caso 3. Negli altri casi, si esce dal while e si termina Nil Nil Nil Nil Nil Nil © Alberto Montresor
Inserimento: complessità Totale: O(log n) O(log n) per scendere fino al punto di inserimento O(1) per effettuare l'inserimento O(log n) per risalire e “aggiustare” (caso pessimo – solo nel caso 3) Esiste anche la possibilità di effettuare una “top-down” insertion Scendere fino al punto di inserimento, “aggiustando” l'albero mano a mano Effettuare l'inserimento in una foglia © Alberto Montresor
Cancellazione in RB L’algoritmo di cancellazione per alberi RB è costruito sull’algoritmo di cancellazione per alberi binari di ricerca 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
Se il nodo “cancellato” è rosso altezza nera invariata Cancellazione in RB Se il nodo “cancellato” è rosso altezza nera invariata non sono stati creati nodi rossi consecutivi la radice resta nera Se il nodo “cancellato” è nero possiamo violare il vincolo 1: la radice può essere un nodo rosso possiamo violare il vincolo 3: se il padre e uno dei figli del nodo cancellato erano rossi abbiamo violato il vincolo 4: altezza nera cambiata L’algoritmo balanceDelete(T,t) ripristina la proprietà Red-Black con rotazioni e cambiamenti di colore: ci sono 4 casi possibili (e 4 simmetrici)! © Alberto Montresor
if u.color = BLACK then balanceDelete(T, t) Cancellazione if u.color = BLACK then balanceDelete(T, t) © Alberto Montresor
Cancellazione - 8 casi possibili © Alberto Montresor
Cancellazione - 8 casi possibili © Alberto Montresor
Cancellazione in RB © Alberto Montresor
L’operazione di cancellazione è concettualmente complicata! Cancellazione in RB L’operazione di cancellazione è concettualmente complicata! Ma efficiente: Dal caso (1) si passa ad uno dei casi (2), (3), (4) Dal caso (2) si torna ad uno degli altri casi, ma risalendo di un livello l’albero Dal caso (3) si passa al caso (4) Nel caso (4) si termina Quindi In altre parole, è possibile visitare al massimo un numero O(log n) di casi, ognuno dei quali è gestito in tempo O(1) © Alberto Montresor
Esercizio - visita non ricorsiva Scrivere l’algoritmo non ricorsivo che effettua un attraversamento in ordine di un ABR Qual è la sua complessità Esercizio - limite inferiore Dimostrare: poiché l'ordinamento basato su confronti di n elementi è Ω(n log n), allora qualunque algoritmo basato su confronti per costruire un ABR è Ω(n log n) Esercizio - proprietà albero Dimostrate che se un nodo in un ABR ha due figli, allora il suo successore non ha un figlio sinistro e il suo predecessore non ha un figlio destro Esercizio L'operazione di cancellazione è commutativa? Nel senso che cancellare x e y oppure cancellare y e x produce lo stesso ABR? © Alberto Montresor