STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°14 albero di ricerca binario Andrea Zanda tutoraggio strutture dati 3-5-2004 1 TESTO ESERCITAZIONE Scrivere un algoritmo C che implementi la struttura albero di ricerca binario. Il programma deve prevedere le funzioni di inserimento, cancellazione, visualizzazione e ricerca. Il campo chiave è costituito da una stringa. Suggerimento. Per semplicità si supponga che ogni dato sia una stringa che ne costituisce la chiave. Per visualizzare i dati utilizzare gli algoritmi che visitano l’albero. Implementare inoltre sia l’algoritmo di ricerca ricorsivo che quello iterativo. Andrea Zanda tutoraggio strutture dati 3-5-2004 2 ALBERI DI RICERCA BINARI Un albero di ricerca binario offre delle prestazioni migliori di quelle delle strutture dati finora studiare, quando le operazioni da svolgere sono l’inserimento, la cancellazione e la ricerca di elementi arbitrari. Definizione: Un albero di ricerca binario è un albero binario che soddisfa le seguenti proprietà: 1) Ogni elemento ha una chiave e le chiavi sono uniche. 2) Le chiavi in un sottoalbero sinistro non vuoto devono essere più piccole della chiave nella radice del sottoalbero. 3) Le chiavi in un sottoalbero destro non vuoto devono essere più grandi della chiave nella radice del sottoalbero. 4) Anche i sottoalberi sinistro e destro sono alberi di ricerca binari Andrea Zanda tutoraggio strutture dati 3-5-2004 3 ALBERI DI RICERCA BINARI ESEMPIO DI ALBERO DI RICERCA BINARIO: 30 40 5 2 Andrea Zanda tutoraggio strutture dati 3-5-2004 4 INSERIMENTO Per inserire un nuovo elemento dobbiamo prima verificare che il valore di chiave sia diverso da quelli degli elementi esistenti. Per fare questo utilizziamo una funzione di ricerca: Se l’albero è vuoto o se il valore della chiave è presente viene fornito NULL, in caso contrario la funzione fornisce un puntatore all’ultimo dell’albero che è stato incontrato durante la ricerca. Il nuovo elemento deve essere inserito come figlio di questo nodo. Andrea Zanda tutoraggio strutture dati 3-5-2004 5 INSERIMENTO ESEMPIO DI INSERIMENTO: 80 30 40 5 2 Andrea Zanda 80 tutoraggio strutture dati 3-5-2004 6 INSERIMENTO ESEMPIO DI INSERIMENTO: 35 30 40 5 2 Andrea Zanda 35 tutoraggio strutture dati 3-5-2004 80 7 INSERIMENTO Algoritmo Andrea Zanda tutoraggio strutture dati 3-5-2004 8 CANCELLAZIONE CANCELLAZIONE DI UN NODO TERMINALE: 35 30 40 5 2 Andrea Zanda 35 tutoraggio strutture dati 3-5-2004 80 9 CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON UN SOLO FIGLIO: 40 30 40 5 2 Andrea Zanda 80 tutoraggio strutture dati 3-5-2004 10 CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON UN SOLO FIGLIO: 40 30 80 5 2 Andrea Zanda tutoraggio strutture dati 3-5-2004 11 CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE FIGLI: 60 40 60 20 10 50 45 70 55 52 Andrea Zanda tutoraggio strutture dati 3-5-2004 12 CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE FIGLI: 60 40 20 55 10 50 45 Andrea Zanda tutoraggio strutture dati 3-5-2004 70 52 13 CANCELLAZIONE Algoritmo Andrea Zanda tutoraggio strutture dati 3-5-2004 14 CANCELLAZIONE CANCELLAZIONE DI UN NODO TERMINALE: 10 if ( p!=NULL && strcmp(item, p->dati)==0) { if (node->destro==NULL) node = node->sinistro; else if (node->sinistro==NULL) node=node->destro; else { tmp = node->sinistro; previous = node; while (tmp->destro!=NULL) { previous = tmp; 40 tmp = tmp->destro; } strcpy(node->dati, tmp->dati); if (previous==node) previous->sinistro = tmp->sinistro; prev else previous->destro = tmp->sinistro; } if (p==*root) *root = node; p else if (prev->sinistro == p) prev->sinistro = node; else prev->destro = node; node } 20 10 node = NULL Andrea Zanda tutoraggio strutture dati 3-5-2004 15 CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON UN SOLO FIGLIO: prev 20 10 node 20 if ( p!=NULL && strcmp(item, p->dati)==0) { if (node->destro==NULL) node = node->sinistro; else if (node->sinistro==NULL) node=node->destro; else { tmp = node->sinistro; previous = node; while (tmp->destro!=NULL) { previous = tmp; 40 tmp = tmp->destro; } strcpy(node->dati, tmp->dati); if (previous==node) previous->sinistro = tmp->sinistro p else previous->destro = tmp->sinistro; node } if (p==*root) *root = node; else if (prev->sinistro == p) prev->sinistro = node; else prev->destro = node; } Andrea Zanda tutoraggio strutture dati 3-5-2004 16 CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE FIGLI: 20 if ( p!=NULL && strcmp(item, p->dati)==0) { if (node->destro==NULL) node = node->sinistro; else if (node->sinistro==NULL) node=node->destro; else { tmp = node->sinistro; previous = node; while (tmp->destro!=NULL) { prev 40 previous = tmp; tmp = tmp->destro; } strcpy(node->dati, tmp->dati); if (previous==node) p previous previous->sinistro = tmp->sinistro; node else previous->destro = tmp->sinistro; } if (p==*root) *root = node; tmp else if (prev->sinistro == p) prev->sinistro = node; else prev->destro = node; } 20 10 Andrea Zanda 25 tutoraggio strutture dati 3-5-2004 17 RICERCA La funzione di ricerca fornisce un puntatore al nodo che contiene la chiave che stiamo cercando, oppure se tale nodo non esiste fornisce NULL. Algoritmo ricorsivo Andrea Zanda Algoritmo iterattivo tutoraggio strutture dati 3-5-2004 18 VISUALIZZAZIONE La visualizzazione può essere implementata con vari algoritmi: preorder, inorder, postorder, level_order. La visualizzazione inorder ci visualizzerà gli elementi con le chiavi ordinate. eseguibile Andrea Zanda tutoraggio strutture dati 3-5-2004 19 SITO SLIDES web.tiscali.it/ANDREAZ Andrea Zanda tutoraggio strutture dati 3-5-2004 20