Laboratorio di Algoritmi e Strutture Dati

Documenti analoghi
Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati


Gennaio

Laboratorio di Algoritmi e Strutture Dati

Esercizi (esercizi 1, 2, 3 e 4) Totale /6 /12 /6 /6 /30

Laboratorio di Algoritmi e Strutture Dati

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Laboratorio di Algoritmi e Strutture Dati

Alberi. Alberi: Esempio di utilizzo

Laboratorio di Algoritmi e Strutture Dati

Alberi ed Alberi Binari di Ricerca

Semantica Operazionale del linguaggio imperativo IMP

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Liste concatenate. Violetta Lonati

Strutture dati Alberi binari

Laboratorio di Algoritmi

Per semplicità eliminiamo le ripetizioni nell'albero.

Laboratorio di Informatica. Lezione 8: Liste e alberi

Laboratorio di Programmazione

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Alberi binari di ricerca

Alberi binari di ricerca

Alberi ed Alberi Binari

In questa lezione Alberi binari di ricerca: la cancellazione

Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo. Fosco.

Alberi binari di ricerca

Esercizi su alberi binari

Alberi e alberi binari I Un albero è un caso particolare di grafo

ALBERI BINARI DI RICERCA

Algoritmi, Strutture Dati e Programmi. UD 3.d: Strutture Dati Dinamiche Alberi

Implementazione dell albero binario in linguaggio C++

Laboratorio di Algoritmi e Strutture Dati

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

RICERCA BINARIA...1 ALBERO BINARIO DI RICERCA (ABR)...3 RICORSIONE...4 ESEMPI DI RICORSIONE IN VISUAL BASIC...5 ESEMPI DI RICORSIONE IN C / C++...

Un esempio di mutua ricorsione

Alberi e alberi binari I Un albero è un caso particolare di grafo

Lezione 12 Tabelle Hash

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Tutoraggio Informatica Generale Inserimento e cancellazione in un ABR Counting Sort

Esercitazione 6. Alberi binari di ricerca

Strutture dati dinamiche

Esercizi parte 3. La classe ArrayBinTree dovra implementare, tra le altre, l operazione seguente: padre: dato un nodo, restituire l indice del padre.

Alberi binari e alberi binari di ricerca

d. Cancellazione del valore 5 e. Inserimento del valore 1

Aniello Murano Problemi non decidibili e riducibilità

Lezione 9 Alberi binari: visite ed esercizi

Esercitazione 8. Corso di Tecniche di programmazione. Laurea in Ingegneria Informatica

Algoritmi e strutture dati

Alberi binari e alberi binari di ricerca

Aniello Murano Classe dei problemi NP. Nella lezione precedente abbiamo visto alcuni problemi che ammettono soluzione polinomiale

PROGRAMMAZIONE 1 e LABORATORIO (A,B) - a.a Prova scritta del 10/01/2012 SOLUZIONI PROPOSTE

now is the for men all good come aid

Aniello Murano NP- Completezza (prima parte)

Alberi binari e alberi binari di ricerca

Alberi due-tre e alberi B

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

Alberi. CORDA Informatica. A. Ferrari. Testi da. Marco Bernardo Edoardo Bontà. Dispense del Corso di. Algoritmi e Strutture Dati

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Alberi Binari di Ricerca

Struttura dati Dizionario

Strutture dati dinamiche in C (II)

7. Settima esercitazione autoguidata: alberi binari

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

Esercizi su programmazione ricorsiva 3

MODULO VERIFICA MACCHINA versione per CARRELLO

Programmazione I - Laboratorio

Laboratorio di Algoritmi e Strutture Dati

Lezione 7 Alberi binari: visite e alberi di ricerca

Implementazione ADT: Alberi

DOMANDA DI ISCRIZIONE alla SCUOLA SECONDARIA di SECONDO GRADO

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

ALGORITMI E STRUTTURE DATI

Cognome e nome nato a in data carica ricoperta DICHIARA / DICHIARANO

- definizione formale di albero - Questa parte e stata fatta alla lavagna. Fare quindi riferimento agli appunti, e al libro (Calvanese et al.

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Note per la Lezione 4 Ugo Vaccaro

Informatica 3. Informatica 3. LEZIONE 14: Alberi binari: introduzione. Lezione 14 - Modulo 1. Definizioni. Introduzione. Definizioni e proprietà

Alberi Binario in Java

Divide et impera su alberi

Alberi binari. Alberi Albero binario Heap tree

Tecniche della Programmazione, M.Temperini, Liste Concatenate 3 1/18

Laboratorio di Algoritmi e Strutture Dati

Esempi. Albero di interi. Struttura che non è un albero!

ricerca di un elemento, verifica dell appartenenza di un elemento

Tecniche di prova per induzione

Esercizi Strutture dati di tipo astratto

UNITA DIDATTICA: FORMULE GONIOMETRICHE

Laboratorio di Informatica

Lezione 15 programmazione in Java. Nicola Drago Dipartimento di Informatica Università di Verona

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Algoritmi e Strutture Dati

Informatica 3. LEZIONE 17: Alberi generici. Modulo 1: Definizione e ADT Modulo 2: Implementazione Modulo 3: Alberi e classi di equivalenza

ALBERI. Un Albero. Un grafo aciclico che non è un albero: due archi entranti in uno stesso nodo

Transcript:

Laboratorio di Algoritmi e Strutture Dati Prof. Aniello Murano Alberi Binari di Ricerca Cancellazione di un nodo Corso di Laurea Codice insegnamento Email docente Anno accademico Informatica 13917 murano@na.infn.it 2007/2008 Lezione numero: 13 Parole chiave: Alberi Binari, Ricerca Binaria, Visite di Alberi 2 Alberi binari di ricerca (ABR) Un albero binario di ricerca (ABR) è un albero binario in cui per ogni nodo dell albero N tutti i nodi del sottoalbero sinistro di N hanno un valore minore o uguale di quello di N e tutti i nodi del sottoalbero destro hanno un valore maggiore di quello del nodo N. 1

3 Riepilogo della precedente lezione in aula Nella lezione precedente abbiamo studiato come: Definire un ABR tramite struct Creare un ABR con un unico nodo o come unione tramite un nuovo nodo radice di due ABR preesistenti; Controllare se un ABR è vuoto; Controllare che un albero è un ABR; Ottenere il valore della radice di un albero; Avere il puntatore al figlio sx/dx di un ABR. Stampare il contenuto di un albero tramite una visita Ricercare un dato elemento o il minimo di un ABR 4 Sommario In questa lezione valuteremo come cancellare un nodo da un ABR. 2

5 Cancellazione Nella cancellazione di un elemento el da un albero bisogna distinguere i seguenti casi: 1. Albero vuoto: non viene realizzata alcuna cancellazione; 2. L elemento el < radice albero: la cancellazione va effettuata nel sottoalbero sinistro; elimina(radice->sinistro,el); 3. L elemento el > radice albero: la cancellazione va effettuata nel sottoalbero destro; elimina(radice->destro,el); 4. L elemento el==radice albero. Si considerano i seguenti casi: 1. La radice è una foglia: 2. Il nodo ha un sottoalbero non vuoto e l altro vuoto. 3. Il nodo ha entrambi i sottoalberi non vuoti. 6 Primo caso La radice è una foglia: viene eliminata liberando la memoria del nodo radice 3

7 Secondo Caso Se il sottoalbero destro e' vuoto: il nodo figlio del nodo padre (10) di el (7) diventa il nodo figlio di el (4); Viene eliminato il nodo el (7). 8 Terzo Caso Il sottoalbero destro e sinistro del nodo el sono non vuoti: viene ricavato il minimo (12) del sottoalbero destro; il minimo (12) viene copiato nel nodo el (10); viene eliminato il minimo (12) del sottoalbero destro. 4

9 Codice per la cancellazione (NO) void *elimina (struct nodo *radice, int el) { struct nodo *aux; if(vuoto(radice)) { printf( elemento non trovato ); return; if(radice->inforadice > el) /* el va cercato nel sottoalbero sinistro */ elimina(radice->sinistro,el); else if(radice->inforadice< el) /* el va cercato nel sottoalb. destro */ elimina(radice->destro,el); else /* Trovato l e elemento da cancellare */ { if(radice->sinistro && radice->destro) /* Il nodo ha due figli*/ { aux=ricerca_minimo(radice->destro); radice->inforadice=aux->inforadice; elimina(radice->destro,aux->inforadice); else { /* Il nodo ha 0 oppure un figlio*/ aux=radice; if (radice->sinistro = NULL) radice=radice->destro; else if (radice->destro = NULL) radice=radice->sinistro; free(aux); return; 10 Osservazioni Il codice precedente, non cancella efficacemente un nodo perchè all atto della cancellazione free(radice); radice=null; deallochiamo effettivamente la memoria per il nodo da cancellare, ma il nodo padre di quest ultimo continuerà a puntare ad una locazione di memoria reale, che non è NULL. La funzione è scorretta perchè porta troppo in avanti il puntatore da non permette la modifica il campo dx o sx del nodo padre. Una soluzione è quella di utilizzare una funzione che ritorni un puntatore a una struttura ad albero (come proposto per le liste). Il valore ritornato, opportunamente gestito nelle chiamate ricorsive, permetterà di modificare l ABR nel modo voluto. Un altra soluzione è quella di utilizzare il metodo del puntatore a puntatore. Questo è da preferirsi quando si ha a che fare con funzioni che devono modificare più oggetti. Di seguito mostriamo la seconda soluzione. 5

11 Come usare il puntatore a puntatore Un ABR con doppio puntatore sarà definito nel seguente modo: struct nodo {int info; struct nodo *sx; struct nod *dx; struct nodo **rad; rad=( struct nodo**)malloc( sizeof( struct nodo)); L ABR sarà referenziato con una cella contiene un indirizzo (rad) di una cella contenente un indirizzo (*rad) di una cella in cui è memorizzato la radice dell albero. Si veda per es. la figura sotto rad * rad **rad contenuto 2000 3000 10 4000 5000 indirizzo 1000 2000 3000 3002 3004 Una chiamata ad una funzione elimina(**rad, el), con el intero da eliminare, passa alla funzione il riferimento alla cella con indirizzo 2000. Una modifica alla radice dell ABR, modificherà anche il contenuto di questa cella. 12 Uso di puntatori a puntatori void elimina(struct nodo **rad, int el) { struct nodo *aux; aux=*rad; if (!(*rad)) { if ((*rad)->info>el) /* cerca el a sx */ elimina(&((*rad)->sx), el); else if ((*rad)->info<el) /* cerca el a dx */ elimina(&((*rad)->dx),el); else { /* Elemento trovato */ **rad 10 (*rad)->info 3000 if (!((*rad)->sx) && (!((*rad)->dx))) { /* el e una foglia */ free(*rad); *rad=null; 4000 (*rad)->sx 5000 (*rad)->dx 3002 3004 &((*rad)->sx) &((*rad)->dx) In riferimento all esempio di struttura precedente 6

13 Uso di puntatori a puntatori /*continua else Elemento trovato */ if (((*rad)->sx) && (!((*rad)->dx))) /* Se dx è vuoto*/ *rad=aux->sx; if (((*rad)->sx) && (!((*rad)->dx))) /* Se sx è vuoto*/ *rad=aux->dx; if ((aux->destro==null) (aux->sinistro==null)) { /* Se un sottoabr è vuoto */ free(aux); return; if (((*rad)->sx) && ((*rad)->dx)) /* Se sx e dx non vuoti*/ { (*rad)->info=ricerca_minimo((*rad)->dx); elimina(&(*rad)->destro, (*rad)->info); 7

This document was created with Win2PDF available at http://www.win2pdf.com. The unregistered version of Win2PDF is for evaluation or non-commercial use only. This page will not be added after purchasing Win2PDF.