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

Slides:



Advertisements
Presentazioni simili
Ordinamento ottimo Ricerca
Advertisements

Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
RB-alberi (Red-Black trees)
Alberi binari di ricerca
Esercizi su alberi binari
Alberi binari Definizione della struttura dati: struct tree { };
Algoritmi e strutture Dati - Lezione 7
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
CORSO DI PROGRAMMAZIONE II Operazioni su alberi ordinati e non
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
Algoritmi e Strutture Dati (Mod. A)
Algoritmi e Strutture Dati
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Algoritmi e Strutture Dati 20 aprile 2001
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Esercizi su alberi binari
Alberi di ricerca binari
RB-insert(T, z) // z.left = z.right = T.nil Insert(T, z) z.color = RED // z è rosso. Lunica violazione // possibile delle proprietà degli alberi // rosso-neri.
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Informatica 2 a.a. 2003/04 Lezione 6
alberi completamente sbilanciati
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche
Prog2 a.a. 2001/ Albero binario di ricerca Un albero binario di ricerca é un albero binario in cui ogni nodo ha un’etichetta.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
© 2015 Giorgio Porcu - Aggiornamennto 01/12/2015 I STITUTO T ECNICO SECONDO BIENNIO T ECNOLOGIE E P ROGETTAZIONE Rappresentazione dell’ Informazione Sistemi.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Esercitazioni di Prog. II (esercizi su alberi ennari)
Progettare algoritmi veloci usando strutture dati efficienti
Inserzione e Cancellazione
Progettare algoritmi veloci usando strutture dati efficienti
Dizionari alberi bilanciati.
Alberi di ricerca di altezza logaritmica
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Lezione n°7 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
Algoritmi e Strutture Dati
B-alberi e alberi autoaggiustanti
Le postcondizioni specificano l’output della funzione.
Esercitazioni di Prog. II (esercizi _aggiuntivi_su alberi binari)
Lezione n°4 Prof.ssa Rossella Petreschi
Algoritmi e Strutture Dati
K4 è planare? E K3,3 e K5 sono planari? Sì!
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Dizionari alberi bilanciati.
I numeri relativi DEFINIZIONE. Si dicono numeri relativi tutti i numeri interi, razionali e irrazionali dotati di segno (positivo o negativo). ESEMPI Numeri.
Introduzione agli Algoritmi e alle Strutture Dati
Alberi n-ary Lezioni di C.
Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C
Progettare algoritmi veloci usando strutture dati efficienti
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Algoritmi e Strutture Dati
comprensione e modifica di codice
LINGUAGGIO C Alberi e livelli
Alberi di ricerca Lezione n°4
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Verifica bilanciamento nel numero dei nodi: definizioni.
concetti ed applicazioni
Algoritmi e Strutture Dati
Ricerca 01/08/2019 package.
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Transcript della presentazione:

Alberi

Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo Daisy Frodo

Alberi Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo Daisy Frodo L'albero genealogico della famiglia Baggins

Alberi Terminologia: gli elementi sono detti nodi Largo Fosco Dora Drogo Dudo Daisy Frodo nodo

Alberi i successori sono detti figli ed i predecessori padre Largo Fosco Dora Drogo Dudo Daisy Frodo padre figli

Alberi i nodi senza figli sono detti foglie (in azzurro) Largo Fosco Dora Drogo Dudo Daisy Frodo foglia

Alberi i nodi con figli sono detti interni (in giallo) Largo Fosco Dora Drogo Dudo Daisy Frodo Nodo interno

Alberi Il nodo iniziale è detto radice (in verde) Largo Fosco Dora Drogo Dudo Daisy Frodo Radice

Alcune definizioni Cammino una sequenza di nodi, in cui ogni nodo è figlio del nodo che lo precede nella sequenza Livello di un nodo numero di nodi da attraversare per arrivare dal nodo alla radice Definizione induttiva: La radice ha livello 0 Se un nodo ha livello n i suoi figli hanno livello n + 1 Livello k dell'albero È l'insieme di tutti e soli i nodi di livello uguale a k Altezza dell'albero È il livello massimo dei nodi nell'albero

Esempio Cammini (Largo,Fosco,Dudo, Daisy) (Fosco,Dora) (Fosco,Drogo,Frodo)... Largo Fosco Dora Drogo Dudo Daisy Frodo Radice

Esempio Livelli Largo Fosco Dora Drogo Dudo Daisy Frodo 0

Esempio Livelli Largo Fosco Dora Drogo Dudo Daisy Frodo 0 1

Esempio Livelli Largo Fosco Dora Drogo Dudo Daisy Frodo

Esempio Livello 2 Largo Fosco Dora Drogo Dudo Daisy Frodo 2 2 2

Esempio L'albero ha altezza 3 Largo Fosco Dora Drogo Dudo Daisy Frodo

Esempio Ogni nodo può essere visto come la radice di un albero più piccolo (sottoalbero) Largo Fosco Dora Drogo Dudo Daisy Frodo Sottoalbero di radice Fosco

Alberi binari Alberi con solo due figli Detti figlio destro e figlio sinistro Esempio:

Alberi binari Alberi con solo due figli Detti figlio destro e figlio sinistro Esempio: Sottoalbero destro Sottoalbero sinistro

Alberi in C Come si realizza un albero binario in C ? Ogni nodo è una struttura che contiene al suo interno due puntatori al suo stesso tipo, ad esempio se l'etichetta è un numero intero posso utilizzare: typedef struct albero { int etichetta; struct albero * left; struct albero * right; } albero_t ; Il puntatore left contiene il puntatore al figlio di sinistra mentre il puntatore right contiene il puntatore al figlio di destra Le foglie utilizzano due puntatori nulli (NULL) nei campi right and left

Esempio: raddoppiare i pari Vogliamo raddoppiare solo le etichette pari Lavorando con gli alberi è naturale usare funzioni ricorsive Ragioniamo sul caso base: Se l'albero è vuoto non devo fare niente Se l'albero contiene solo un nodo foglia devo controllare se l'etichetta è pari e se lo è raddoppiare il valore Supponiamo di saper risolvere il problema per un albero di livello n, allora per risolvere il problema per un albero di livello n+1 posso: Controllare l'etichetta della radice e raddoppiarla se è pari Chiamare ricorsivamente la funzione che risolve il problema per un albero di livello n sia sul sottoalbero destro che sul sottoalbero sinistro

Esempio: raddoppiare i pari Codifica void raddoppia_pari(albero_t* r) { if ( r == NULL ) return ; if ( ( r -> etichetta ) % 2 == 0 ) r -> etichetta = 2 * ( r -> etichetta ) ; raddoppia_pari(r->left); raddoppia_pari(r->right); }

Osservazioni Nell'esempio precedente abbiamo scelto di operare analizzando nell'ordine La radice dell'albero Il sottoalbero di sinistra Il sottoalbero di destra Poiche l'analisi dei sottoalberi sinistro e destro avviene utilizzando la stessa procedura ricorsiva, anche la loro analisi opera allo stesso modo (prima la radice, poi il sottoalbero sx, quindi il sottoalbero dx... )

Osservazioni Avremmo potuto procedere diversamente : void raddoppia_pari(albero_t* r) { raddoppia_pari(r->left); if ( r == NULL ) return ; if ( ( r -> etichetta ) % 2 == 0 ) r -> etichetta = 2 * ( r -> etichetta ) ; raddoppia_pari(r->right); } Oppure.....

Osservazioni Oppure..... void raddoppia_pari(albero_t* r) { raddoppia_pari(r->left); raddoppia_pari(r->right); if ( r == NULL ) return ; if ( ( r -> etichetta ) % 2 == 0 ) r -> etichetta = 2 * ( r -> etichetta ) ; } In questo caso è indifferente, perchè è indifferente l'ordine in cui elaboriamo i nodi dell'albero....

Osservazioni Ci sono molti casi in cui l'ordine in cui vengono elaborati i nodi di un albero è rilevante e modifica il risultato Un esempio è la stampa delle etichette,

Osservazioni Ci sono molti casi in cui l'ordine in cui vengono elaborati i nodi di un albero è rilevante e modifica il risultato Un esempio è la stampa delle etichette, Posso avere 7, 15, -3, 5, -10 (prima il sottoalbero di sinistra) -10, 5, -3, 15, 7 (prima il sottoalbero di destra) 15, 7, 5, -3, -10 (prima la radice, poi sx).... etc

Visita di un albero Visitare un albero significa analizzare in sequenza tutti i suoi nodi Molti problemi sugli alberi sono varianti del problema di effettuare una visita Ci sono diversi tipi di visita, che differiscono nell'ordine in cui vengono analizzati i nodi Visite depth-first (in profondità), sono di tre tipi : visita anticipata: si analizza la radice, poi si effettua la visita anticipata del sottoalbero SX e poi si effettua la visita anticipata del sottoalbero DX visita simmetrica: si effettua la visita simmetrica del sottoalbero SX, poi si analizza la radice e poi si effettua la visita simmetrica del sottoalbero DX visita posticipata: si effettua la visita posticipata del sottoalbero SX, poi si effettua la visita posticipata del sottoalbero DX, e infine si analizza la radice

Visita di un albero Visitare un albero significa analizzare in sequenza tutti i suoi nodi Molti problemi sugli alberi sono varianti del problema di effettuare una visita Ci sono diversi tipi di visita, che differiscono nell'ordine in cui vengono analizzati i nodi Visite depth-first (in profondità), sono di tre tipi : visita anticipata visita simmetrica visita posticipata Visita breadth-first (per livelli): si visita prima la radice (livello 0), poi si visitano tutti i nodi di livello 1, poi tutti i nodi di livello 2, etc....

Visita simmetrica Supponiamo di avere una funzione void analizza_nodo(albero_t* n); ● Questa funzione elabora il valore del singolo nodo, secondo il problema che dobbiamo risolvere, eventualmente modificandolo Quindi la funzione che effettua la visita simmetrica è void visitaSimmetrica (albero_t* bt){ if (bt == NULL) return; visitaSimmetrica(bt -> left); analizza_nodo(bt); visitaSimmetrica(bt -> right); }

Visita anticipata void visitaAnticipata (albero_t* bt){ if (bt == NULL) return; analizza_nodo(bt); visitaAnticipata(bt -> left); visitaAnticipata(bt -> right); }

Visita posticipata void visitaPosticipata (albero_t* bt){ if (bt == NULL) return; visitaPisticipata(bt -> left); visitaPosticipata(bt -> right); analizza_nodo(bt); }

Esempio : ricerca Supponiamo di avere un tipo albero in cui l'etichetta dei nodi è una stringa Scrivere una funzione di prototipo int ricerca (albero_t* bt, char * s); che restituisce 1 se esiste la stringa s nell'albero bt e 0 altrimenti

Esempio : ricerca Possiamo modificare una qualsiasi delle tre visite viste. Scegliamo la visita anticipata, Nel nostro caso l'analisi del nodo richiede il confronto di due stringhe Inoltre bisogna riportare correttamente il valore restituito dalle chiamate ricorsive alla funzione

Esempio : ricerca int ricerca (albero_t* bt, char* s){ if (bt == NULL) return 0; else if (strcmp(bt->val,s) == 0 ) return 1; else if ( ricerca(bt -> left,s) == 1 ) return 1; else return ricerca(bt -> right,s); }

Esempio : somma Supponiamo di avere un tipo albero in cui l'etichetta dei nodi è un double Scrivere una funzione di prototipo double somma (albero_t* bt); che restituisce la somma di tutte le etichette presenti nell'albero

Esempio : somma Possiamo modificare una qualsiasi delle tre visite viste. Scegliamo la visita posticipata Nel nostro caso l'analisi del nodo richiede la somma con i valori ottenuti dal sottoalbero di destra e di sinistra

Esempio : somma double somma_alb (albero_t* bt){ double sx, dx; if (bt == NULL) return 0; sx = somma_alb(bt -> left); dx = somma_alb(bt -> right); return sx + bt->val + dx; }

Esempio : alberi binari di ricerca Definito un ordinamento sull’informazione dei nodi un albero binario è un albero binario di ricerca se: Per ogni nodo N dell’albero: - L’informazione associata ad ogni nodo nel sottoalbero sinistro di N è strettamente minore dell’informazione associata ad N; -L’informazione associata ad ogni nodo nel sottoalbero destro di N è strettamente maggiore dell’informazione associata ad N;

Ad esempio Etichette intere, operatore minore o uguale

Esercizi Supponiamo di avere un albero binario di ricerca con etichette intere Scrivere una funzione che cerca se un valore x è presente nell'albero con un numero di passi pari all'altezza dell'albero Scrivere una funzione che inserisce una nuova etichetta x nell'albero mantenendo l'ordinamento fra i nodi Scrivere una funzione che cancella un nodo dell'albero con una certa etichetta x mantenendo l'albero ordinato