Alberi ed Alberi Binari

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

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

Esercitazione 6. Alberi binari di ricerca

Algoritmi e Strutture Dati

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Note per la Lezione 4 Ugo Vaccaro

Alberi binari e alberi binari di ricerca

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

Alberi binari. Esercizi su alberi binari

Heap e code di priorità

Alberi Binari di Ricerca

Implementazione dell albero binario in linguaggio C++

Espressioni aritmetiche

I tipi di dato astratti

Alberi binari di ricerca

Lezione 7 Alberi binari: visite e alberi di ricerca

Laboratorio di Python

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.

Implementazione ADT: Alberi

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Questa soluzione va contemplata quando le lunghezze stimate dalle liste usate sono significativamente maggiori delle dimensioni di un elemento.

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Lezione 12 Tabelle Hash

Problemi di ordinamento

Algoritmi e Strutture Dati. HeapSort

Laboratorio di Python

Esercizi su alberi binari

In questa lezione Alberi binari di ricerca: la cancellazione

Lezione 9 Alberi binari di ricerca

Alberi. La definizione ricorsiva: Un albero radicato (non vuoto) è: o un singolo nodo o una radice connessa a un insieme di alberi.

Per semplicità eliminiamo le ripetizioni nell'albero.

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Alberto Montresor Università di Trento

Strutture dati dinamiche in C (II)

Alberi Binari di Ricerca

La struttura dati ad albero binario

Algoritmi e Strutture Dati

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Esercizi di Algoritmi e Strutture Dati

Un albero completamente bilanciato o pieno (full) alberi completamente sbilanciati. Un albero binario completo

Verificare se un albero binario è bilanciato

In questa lezione Strutture dati elementari: Pila Coda

Strutture dati per insiemi disgiunti

Esercizi su strutture dati

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Algoritmi e Strutture Dati. Alberi

Algoritmi e Strutture Dati

lezione 9 min-heap binario Heap e Alberi posizionali generali

Programmazione Greedy I codici di Huffman

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Il tipo astratto coda con priorità: specifiche sintattiche e semantiche. Realizzazioni.

Lezione 9 Alberi binari di ricerca

5. Quinta esercitazione autoguidata: liste semplici

Algoritmi e Strutture di Dati I 1. Algoritmi e Strutture di Dati I Massimo Franceschet francesc

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

Transcript:

Alberi ed Alberi Binari Il tipo di dato Albero Un albero è una struttura di data organizzata gerarchicamente. È costituito da un insieme di nodi collegati tra di loro: ogni nodo contiene dell informazione, detta etichetta del nodo i nodi collegati ad un certo nodo n vengono detti figli di n i nodi che non hanno figli sono detti foglie dell albero c è un unico nodo che non è figlio di alcun altro nodo, detto radice dell albero (scendendo a partire dalla radice si raggiungono tutti i nodi dell albero) Albero vuoto: non ha nessun nodo (nemmeno la radice) 1

Il tipo di dato Albero Esempio: Albero in cui le etichette sono degli interi 49 La radice ha etichetta 49 22 82 I figli della radice hanno etichette 22 e 82 85 17 8 57 20 88 34 94 Le foglie hanno etichette 85, 8, 20, 57, 91, 34 91 Alberi: alcune definizioni Cammino in un albero: sequenza di nodi, in cui ogni nodo è figlio del nodo che lo precede nella sequenza Livello (o profondità) di un nodo è la sua distanza dalla radice (quanto in basso si trova nell albero). Definizione formale (induttiva) di livello di un nodo: la radice ha livello 0 se un nodo ha livello i, allora i suoi figli hanno livello i + 1 Il livello i di un albero è formato da tutti i nodi a livello i. 2

Alberi binari Un albero binario è un albero in cui ogni nodo ha al massimo 2 figli i due figli vengono detti figlio sinistro e figlio destro se consideriamo la parte di albero costituita dal figlio sinistro, dai suoi figli, dai figli dei suoi figli,..., questa è di nuovo un albero binario, detto sottoalbero sinistro (analogamente si definisce il sottoalbero destro) Alberi binari Per rappresentare un albero binario in forma testuale si usa la notazione parentetica: albero vuoto: () albero non vuoto: ( radice sottoalbero-sinistro sottoalbero-destro ) se manca un figlio si mette l albero vuoto come figlio Esempio: ( 49 (22 ) ) (17 (85 () ()) (8 () ())) (82 (88 (57 () ()) (94 (91 () ()) ()) ) (34 () ()) 85 ) 22 49 57 82 17 88 8 91 94 34 3

Rappresentazione collegata degli alberi binari L elemento fondamentale è il nodo, che ha un etichetta è collegato ai sottoalberi sinistro e destro (eventualmente vuoti) Usiamo una struct a 3 campi: etichetta due puntatori ai sottoalberi sinistro e destro Rappresentazione collegata degli alberi binari typedef TipoInfoAlbero; /* tipo dell etichetta dei nodi struct nodoalbero { TipoInfoAlbero info; struct nodoalbero *destro, *sinistro; typedef struct nodoalbero NodoAlbero; typedef NodoAlbero *TipoAlbero; 4

Visita di un albero E l analisi in sequenza di tutti i nodi dell albero. La maggior parte delle operazioni sugli alberi possono essere considerate delle varianti di visite. Diversi tipi di visita, che differiscono per l ordine in cui vengono visitati i nodi. visita in preordine: si analizza la radice, poi si visita in preordine il sottoalbero sinistro, poi il sottoalbero destro visita in postordine: si visita in postordine il sottoalbero sinistro, poi il sottoalbero destro, infine si analizza la radice visita in ordine simmetrico (inorder): si visita in ordine simmetrico il sottoalbero sinistro, poi si analizza la radice, infine si visita in ordine simmetrico il sottoalbero destro visita per livelli: si visita prima la radice (livello 0), poi tutti i nodi a livello 1, poi tutti i nodi a livello 2,... Visita di un albero: esempio Preordine 49, 22, 17, 85, 8, 82, 88, 57, 94, 91, 34 Postordine 85, 8, 17, 22, 57, 91, 94, 88, 34, 82, 49 Simmetrica 85, 17, 8, 22, 49, 57, 91, 94, 88, 82, 34 A livelli 49, 22, 82, 17, 88, 34, 85, 8, 57, 94, 91 85 49 22 82 17 88 34 8 57 94 91 5

Implementazione delle visite Supponiamo di aver definito una funzione Analizza, a cui passiamo l etichetta di un nodo, la quale effettua l operazione richiesta dalla visita (assumiamo che sia semplicemente la stampa dell etichetta). Le visite in preordine, postordine, simmetrica hanno una implementazione banale se si adotta un algoritmo di tipo ricorsivo La visita per livelli presenta un problema: dopo aver visitato un nodo, dobbiamo visitare i suoi fratelli, ma dobbiamo anche ricordarci i suoi figli (per visitarli dopo) È necessario utilizzare una struttura dati di appoggio (una coda), i cui elementi sono i nodi ancora da analizzare Visita in preordine void VisitaPreordine(TipoAlbero a) { if (a!= NULL) { /* analizza la radice Analizza(a->info); /* analizza il sottoalbero sinistro VisitaPreordine(a->sinistro); destro VisitaPreordine(a->destro); /* e poi il 6

Visita in postordine void VisitaPostordine(TipoAlbero a) { if (a!= NULL) { /* analizza il sottoalbero sinistro VisitaPostordine(a->sinistro); destro VisitaPostordine(a->destro); Analizza(a->info); /* e poi il /* analizza la radice Visita in ordine simmetrico void VisitaInordine(TipoAlbero a) { if (a!= NULL) { /* analizza il sottoalbero sinistro VisitaInordine(a->sinistro); /* analizza la radice Analizza(a->info); destro VisitaInordine(a->destro); /* e poi il 7

Visita per livelli Si presuppone di aver già definito ed incluso il tipo Coda void VisitaLivelli(TipoAlbero albero) { TipoCoda coda; TipoAlbero a; InitCoda(&coda); /* crea la coda e... InCoda(&coda, albero); radice /*... inserisce la while (!TestCodaVuota(coda)) { OutCoda(&coda, &a); coda /* estrai un nodo dalla if (a!= NULL) { Analizza(a->info); /* analizza il nodo estratto InCoda(&coda, a->sinistro); /* metti in coda i sottoalberi InCoda(&coda, a->destro); Esercizi Implementare le visite in preordine, in postordine ed in ordine simmetrico utilizzando un algoritmo iterativo (sarà necessario usare una pila) Funzione che determina se l albero contiene un nodo con una certa etichetta Funzione che stampa tutte le foglie dell albero Per alberi con etichette di tipo int, funzione che stampa la somma delle etichette di tutti i nodi dell albero di tutte le foglie dell albero di tutti i nodi ad un certo livello dei nodi del sottoalbero la cui radice ha un etichetta data Funzione che costruisce la lista dei nodi dell albero visitati in preordine, postordine, per livelli delle foglie dell albero dei nodi di un certo livello 8