Andrea Zandatutoraggio strutture dati STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°14 albero di ricerca binario
Andrea Zandatutoraggio strutture dati 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 lalbero. Implementare inoltre sia lalgoritmo di ricerca ricorsivo che quello iterativo.
Andrea Zandatutoraggio strutture dati 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 linserimento, 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 Zandatutoraggio strutture dati ALBERI DI RICERCA BINARI ESEMPIO DI ALBERO DI RICERCA BINARIO:
Andrea Zandatutoraggio strutture dati 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 lalbero è vuoto o se il valore della chiave è presente viene fornito NULL, in caso contrario la funzione fornisce un puntatore allultimo dellalbero che è stato incontrato durante la ricerca. Il nuovo elemento deve essere inserito come figlio di questo nodo.
Andrea Zandatutoraggio strutture dati INSERIMENTO ESEMPIO DI INSERIMENTO: 80
Andrea Zandatutoraggio strutture dati ESEMPIO DI INSERIMENTO: INSERIMENTO 35
Andrea Zandatutoraggio strutture dati INSERIMENTO Algoritmo
Andrea Zandatutoraggio strutture dati CANCELLAZIONE CANCELLAZIONE DI UN NODO TERMINALE:
Andrea Zandatutoraggio strutture dati CANCELLAZIONE DI UN NODO NON TERMINALE CON UN SOLO FIGLIO: CANCELLAZIONE
Andrea Zandatutoraggio strutture dati CANCELLAZIONE DI UN NODO NON TERMINALE CON UN SOLO FIGLIO: CANCELLAZIONE
Andrea Zandatutoraggio strutture dati CANCELLAZIONE CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE FIGLI:
Andrea Zandatutoraggio strutture dati CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE FIGLI: CANCELLAZIONE
Andrea Zandatutoraggio strutture dati CANCELLAZIONE Algoritmo
Andrea Zandatutoraggio strutture dati 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; tmp = tmp->destro; } strcpy(node->dati, tmp->dati); if (previous==node)previous->sinistro = tmp->sinistro; else previous->destro = tmp->sinistro; } if (p==*root)*root = node; else if (prev->sinistro == p) prev->sinistro = node; else prev->destro = node; } prev p node node = NULL CANCELLAZIONE CANCELLAZIONE DI UN NODO TERMINALE: 10
Andrea Zandatutoraggio strutture dati 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; tmp = tmp->destro; } strcpy(node->dati, tmp->dati); if (previous==node)previous->sinistro = tmp->sinistro; else previous->destro = tmp->sinistro; } if (p==*root)*root = node; else if (prev->sinistro == p) prev->sinistro = node; else prev->destro = node; } p node CANCELLAZIONE DI UN NODO NON TERMINALE CON UN SOLO FIGLIO: 20 CANCELLAZIONE prev node
Andrea Zandatutoraggio strutture dati 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; tmp = tmp->destro; } strcpy(node->dati, tmp->dati); if (previous==node) previous->sinistro = tmp->sinistro; else previous->destro = tmp->sinistro; } if (p==*root)*root = node; else if (prev->sinistro == p) prev->sinistro = node; else prev->destro = node; } p node CANCELLAZIONE DI UN NODO NON TERMINALE CON DUE FIGLI: 20 prev CANCELLAZIONE 25 tmp previous
Andrea Zandatutoraggio strutture dati 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 Algoritmo iterattivo
Andrea Zandatutoraggio strutture dati La visualizzazione può essere implementata con vari algoritmi: preorder, inorder, postorder, level_order. La visualizzazione inorder ci visualizzerà gli elementi con le chiavi ordinate. VISUALIZZAZIONE eseguibile
Andrea Zandatutoraggio strutture dati SITO SLIDES web.tiscali.it/ANDREAZ