Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona
Sommario Implementazione con Vettori Implementazione con Strutture Collegate
Concetti di base Tipo di dato non lineare Memorizza informazioni in modo gerarchico Padre di x Radice x Fratelli di x Figli di x Foglie
Terminologia Terminologia Livello di un nodo: lunghezza (N.ro nodi) percorso unico radice-nodo Ramo percorso radice-foglia Altezza albero lunghezza ramo piu' lungo
Operazioni Operazioni per ADT albero element(v): restituisce l'elemento memorizzato nel nodo v root(): restituisce il nodo radice parent(v): restituisce il genitore del nodo v children(v): restituisce i gli di v isleaf(v): vero se v e' una foglia isroot(v): vero se v e' la radice
Altre Operazioni Altre Operazioni per ADT albero livello di un nodo altezza dell'albero numero nodi numero foglie arita': massimo numero di gli di un nodo isempty: vero se l'albero ha zero nodi
Implementazione con Array paralleli Array Paralleli Indicizziamo ciascun nodo con un identicativo (Intero) Un vettore E[num nodi] di elementi (e.g., Integer, Studente, etc.) per accedere alle informazioni contenute nel nodo E[i] = elemento contenuto nel nodo con id i Tre vettori di interi per mantenere la struttura: Padre P[i] = identicativo del padre di i (-1 se radice) Figlio F[i] = identicativo del primo glio di i (-1 se foglia) Fratello Fr[i] = identicativo del fratello successivo di i (-1 se non ha fratelli) Necessario un ordinamento tra gli e fratelli e.g, Il primo glio e' quello piu' a sinistra, il fratello successivo e' il primo fratello a destra.
Implementazione con Array paralleli: Esempio Example (Array paralleli) 2 1 3 5 P Fi Fr E 4 6 7 1-1 2-1 e1 2 1-1 3 e2 3 1 4 5 e3 4 3-1 -1 e4 5 1 6-1 e5 6 5-1 7 e6 7 5-1 -1 e7
Implementazione tramite strutture collegate Nodo dell'albero Deniamo un nodo che contiene: 1 l'elemento da rappresentare 2 un riferimento al nodo padre 3 un riferimento al primo glio 4 un riferimento al fratello successivo Deniamo metodi opportuni per manipolare le informazioni contenute nel nodo Classe TreeNode.java
Implementazione Tramite Strutture Collegate: Esempio Example (Strutture Collegate) 1 1 2 3 5 2 3 5 4 6 7 4 6 7
Esercizi Esercizi su alberi Calcolare il livello di un nodo, implementare il metodo level() della classe TreeNode.java. Assumere che il livello del padre sia 1 Calcolare l'altezza di un sottoalbero, implementare il metodo height() della classe TreeNode.java. Assumere che l'altezza di una foglia sia 1.
Implementazione tramite strutture collegate L'albero L'albero viene denito con un riferimento al nodo radice Deniamo metodi opportuni per la struttura albero visite metodi per gestire le informazioni rilevanti Interfaccia Tree.java Classe LinkedTree.java
Tipologie di visite Visita: accedere a tutti gli elementi dell'albero, Ordine di accesso denisce la tipologia di visita Denite in maniera ricorsiva Profondita' pre-ordine in-ordine post-ordine Ampiezza
in profondita': pre-ordine Visita in Pre-Ordine Prima il nodo poi i gli pre-ordine(nodo) se il nodo e' null stop accedi all'elemento del nodo (e.g. stampa) visita tutti i sottoalberi del nodo
in Profondita': post-ordine Post-ordine prima i gli poi il nodo post-ordine(nodo) se il nodo e' null stop visita tutti i sottoalberi del nodo accedi all'elemento del nodo (e.g. stampa)
in Profondita': in-ordine In-ordine Appropriata quando gli elementi dell'albero possono essere ordinati binari di ricerca in-ordine(nodo) se il nodo e' null stop visita il sottoalbero del primo glio accedi all'elemento del nodo (e.g. stampa) visita tutti gli altri sottoalberi del nodo
in Profondita' in Profondita' 1 2 7 2 3 5 1 4 6 1 3 6 4 6 7 3 5 7 2 4 5 Pre ordine In ordine Post ordine
Visita in Ampiezza Visita in Ampiezza Visita a livelli Utilizza una coda di appoggio visita(nodo) metti in coda nodo no a quando ho elementi nella coda estrai primo nodo della coda accedi all'elemento del primo nodo metti in coda tutti i gli del nodo estratto
Visita in Ampiezza Visita in Ampiezza 1 2 3 4 5 6 7
Esercizi Esercizi su Realizzare la visita in post ordine, implementare il metodo postordine(...) della classe LinkedTree.java Realizzare la visita in ampiezza, implementare il metodo ampiezza(...) della classe LinkedTree.java Calcolare il numero di nodi di un albero, realizzare il metodo numnodi() della classe LinkedTree.java Calcolare l'arita; di un albero, realizzare il metodo arita(...) della classe LinkedTree.java