Implementazione ADT: Alberi

Documenti analoghi
Alberi binari di ricerca

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

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

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

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Alberi Binario in Java

Binary Search Trees (BST) Algoritmi sui BST. Algoritmi - Ricerca. Fondamenti di Informatica T2 Modulo 2. Università di Bologna A.A.

Alberi binari e alberi binari di ricerca

Alberi Binari di Ricerca

Alberi ed Alberi Binari

Per semplicità eliminiamo le ripetizioni nell'albero.

lezione 9 min-heap binario Heap e Alberi posizionali generali

Algoritmi e strutture dati

Algoritmi e Strutture Dati

Alberi binari ( 7.3)

Esercitazione 6. Alberi binari di ricerca

Lezione 12 Tabelle Hash

Implementazione dell albero binario in linguaggio C++

Le liste. ADT e strutture dati per la rappresentazione di sequenze. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez. 5

ADT Dizionario. Ordered search table. Supponiamo che sia definita una relazione d'ordine totale sulle chiavi del dizionario D:

Alberi ( GT. 7 ) In informatica, un albero è un modello astratto con cui viene rappresentata una struttura gerarchica

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

STRUTTURE DATI: OLTRE GLI ARRAY LISTE

heap heap heap? max- e min-heap concetti ed applicazioni heap = catasta condizione di heap non è una struttura ordinata

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

Inserimento in una lista ordinata

Un esempio di mutua ricorsione

Informatica 3. Informatica 3. LEZIONE 17: Alberi generici. Lezione 17 - Modulo 1. Introduzione. ADT dell albero generico.

Laboratorio 9 ( Java 4 ) Classe astratta per BFS su grafo

Alberto Montresor Università di Trento

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

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

Alberi binari e di ricerca. Parte 1 BST e GUI. Introduzione. 1. Minimo Antenato Comune. 2. Vistita in ampiezza

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

Capitolo 17. Introduzione alle strutture di dati. Capitolo 17 Introduzione alle strutture di dati

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

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

alberi tipo astratto, implementazione, algoritmi

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Laboratorio di Algoritmi e Strutture Dati. Alberi Binari

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

Tipi di dato e Strutture dati elementari

Heap e code di priorità

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

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Università di Verona

Algoritmi e Strutture Dati

Alberi Binari di Ricerca

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

ALGORITMI E STRUTTURE DATI

Strutture dati dinamiche in C (II)

Divide et impera su alberi

Algoritmi e Strutture Dati. Alberi

Espressioni aritmetiche

dizionari alberi bilanciati

Implementazione con alberi binari di ricerca

alberi binari e ricorsione

Esercizi Capitolo 6 - Alberi binari di ricerca

In questa lezione Alberi binari di ricerca: la cancellazione

Laboratorio di Algoritmi e Strutture Dati

ADT Coda con priorità

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Albero Binario GT 7.3. interfacce di Positio<E>, Tree<E>, e BinaryTree<E>; il file TestLinkedBinaryTree.java

Un esempio: l ADT Dizionario (mutabile) Definizione. Alberi binari di ricerca (BST = binary search tree) search(chiave k) -> elem

Esercizio: Lista Circolare

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

alberi completamente sbilanciati

Problemi di ordinamento

Lezione 9 Alberi binari di ricerca

Visite di alberi binari. Laboratorio di Algoritmi e Strutture Dati

Il TDA Dictionary. Definizione informale. I metodi del TDA Dictionary 1. Applicazioni. I metodi del TDA Dictionary 2. I metodi del TDA Dictionary 3

Liste concatenate. Collezione ordinata di nodi. Carlo Paolo Simona. Anna. ciascun nodo contiene due riferimenti:

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

Lezione 9 Alberi binari: visite ed esercizi

Alberi. Definizioni principali

Alberi di ricerca. Alberi binari di ricerca. F. Damiani - Alg. & Lab. 04/05 (da C. Demetrescu et al - McGraw-Hill)

Fondamenti di Informatica T-1 Modulo 2

Alberi binari di ricerca

Esercitazione 3. Heapsort

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

Alberi Binari di Ricerca

Introduzione alla gestione delle collezioni di oggetti

Preparazione allo Scritto di Programmazione

Algoritmi e Strutture Dati. HeapSort

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.

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Alberi binari. Esercizi su alberi binari

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

Esercitazioni di Algoritmi e Strutture Dati

Note per la Lezione 4 Ugo Vaccaro

Informatica 3. Informatica 3. LEZIONE 13: Liste doppie, pile e code. Lezione 13 - Modulo 1. Free list (2) Free list. Free list

Metodi di una Collection

Alberi di ricerca binari

Il tipo astratto di dati Node List

Capitolo 3: Gli alberi. Alberi n-ari

Esercizi su alberi binari

ALBERI DI RICERCA BINARI (O ALBERI BINARI DI RICERCA)

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

Transcript:

Implementazione ADT: Alberi Livelli di astrazione 2001/2002 1

Esercitazione 5 (E6): alberi (tree) albero struttura dati fondamentale, soprattutto per le operazioni di ricerca tipi di albero con radice ordinati: binari avl, RedBlack, Btree, ecc. diverse implementazioni array paralleli strutture dinamiche (linked) maggior attenzione per gli alberi binari di ricerca 2001/2002 2

E6: alberi Esempio di rappresentazione 1 2 6 7 3 4 5 8 9 10 Rappresentazione classica 2 Rappresentazione modulare 1 3 4 5 6 7 8 9 10 2001/2002 3

E6: alberi - implementazione Un'implementazione con vettori paralleli 3 vettori di dimensione = # nodi: Padre, Figlio, Fratello Padre[i]= j se j è padre di i, 0 se è radice Figlio[i]= j se j è il primo figlio di i, 0 se è foglia Fratello[i]= j se j è il fratello successivo di i, 0 se non ci sono fratelli successivi 2001/2002 4

E6: alberi - implementazione Esempio implementaz. con vettori paralleli 2 6 7 2 6 7 1 3 4 5 1 8 9 10 3 4 5 8 9 10 PFiFr 1 0 2 0 2 1 6 3 3 1 0 4 4 1 0 5 5 1 8 0 6 2 0 7 7 2 0 0 8 5 0 9 9 5 0 10 10 5 0 0 2001/2002 5

E6: alberi - implementazione Un'implementazione con strutture dinamiche struttura dati di base: public class Node { Object elemento; //le variabili sono visibil Node padre, figlio, fratello;//a livello package... un albero: Node radice = new Node(); 2001/2002 6

E6: alberi - implementazione Esempio implem. con strutture dinamiche 1 1 2 3 4 5 2 3 4 5 6 7 8 9 10 6 7 8 9 10 1 p fi fr 2 p fi fr 3 p fi fr 4 p fi fr 5 p fi fr 6 p fi fr 7 p fi fr 8 p fi fr 9 p fi fr 10 p fi f 2001/2002 7

E6: alberi - implementazione Quali operazioni? per gli alberi radicati ordinati le operazioni sono a basso livello (orientate ai nodi) per alberi particolari si definiscono invece operazioni generali a più alto livello (vedi alberi di ricerca) per tutti, si definiscono le operazione di visita 2001/2002 8

E6: alberi - operazione visita Visita (attraversamento) = operazione dove ciascun nodo è esaminato esattamente una volta in qualche particolare ordine Tipi visite più comuni: pre-ordine, post-ordine, in-ordine, (solo per gli alberi binari) 2001/2002 9

E6: alberi - visita pre-ordine Visita pre-ordine ricorsiva /** * visitapreordine(node nodo) esegue una visita in pre-ordine dell albero * con radice nodo. In ogni nodo visitato, richiama la procedura * visita(object) */ void visitapreordine(node nodo) { if (nodo!= null) { // verifico se siamo fine ricorsione visita(nodo); // prima visito nodo Node figlio = nodo.figlio; while (figlio!= null) { // per ciascun figlio (sottoalbero) eseguo visita visitapreordine(figlio); // pre-ordine in modo ricorsivo figlio = figlio.fratello; 2001/2002 10

E6: alberi - visita post-ordine Visita post-ordine ricorsiva /** * visitapostordine(node nodo) esegue una visita in post-ordine dell albero * con radice nodo. In ogni nodo visitato, richiama la procedura * visita(object) */ void visitapostordine(node nodo) { if (nodo!= null) { // verifico se siamo fine ricorsione Node figlio = nodo.figlio; while (figlio!= null) { // per ciascun figlio (sottoalbero) eseguo visita visitapostordine(figlio); // post-ordine in modo ricorsivo figlio = figlio.fratello; visita(nodo); // visito nodo 2001/2002 11

E6: alberi - visita pre-ordine iterativa Visita pre-ordine ITERATIVA /** visitapreordinei(node nodo) esegue una visita in pre-ordine dell albero * con radice nodo. In ogni nodo visitato, richiama la procedura * visita(object) */ void visitapreordinei(node nodo) { Pila pila = new PilaArray(); //struttura di supporto Node n; pila.push(nodo); while (! pila.evuota()) { n = (Node) pila.pop(); if (n!= null) { visita(n); Pila pilafigli = new PilaArray(); //pila di supporto per memorizzare i fig Node son = n.figlio; 2001/2002 12

E6: alberi - visita pre-ordine iterativa Visita pre-ordine ITERATIVA - continua while (son!= null) { pilafigli.push(son); son = son.fratello; while (! pilafigli.evuota()) { pila.push(pilafigli.pop()); //memorizzo tutti i figli nella pilafig //inserisco nella pila di chiamata // i figli, nell ordine corretto 2001/2002 13

E6: alberi - alberi binari di ricerca Albero binario di ricerca = albero radicato ordinato dove ogni nodo interno ha al più due figli: figlio sx e figlio dx nuovo tipo di visita = in-ordine il nodo è visitato dopo la visita del figlio sx e prima della visita figlio dx. le operazioni sono definite a livello di albero: find(object), insert(object), delete(object) le operazioni di inserimento/cancellazione devono preservare l ordinamento 2001/2002 14

E6: alberi binari ricerca-visita in-ordine /** * visitainordine(node nodo) esegue una visita in-ordine * dell albero BINARIO con radice nodo. In ogni nodo visitato, * richiama la procedura visita(object) */ void visitainordine(node nodo) { if (nodo!= null) { // verifico se siamo fine ricorsione visitainordine(nodo.figliosx); visita(nodo); // visito nodo visitainordine(nodo.figliodx); Per visita pre e post-ordine le procedure sono analoghe 2001/2002 15

E6: alberi binari ricerca - find /** * find(object item) cerca l oggetto item all interno dell albero * Restituisce il nodo che contiene item se esiste, null altriment */ public BinaryNode find (Object item) { //versione iterativa BinaryNode node = radice; int result; while (node!= null) { if ( (result = ((Comparable) item).compareto(node.elemento())) < 0) { node = node.figliosx; else if (result == 0) return node; else node = node.figliodx; return node; // item può essere nel sottoalbero sx //trovato! // item può essere nel sottoalbero dx 2001/2002 16 // la ricerca è fallita, ritorno null

E6: alberi binari ricerca - insert /** * inserisci(object item) inserisce l oggetto item in un nodo x * all interno dell albero in modo tale che il sottoalbero sx * di x contenga elementi inferiori e il sottoalbero dx di x * elementi superiori a item */ public void insert(object item) { radice = insertitem(item, radice, null); 2001/2002 17

E6: alberi binari ricerca - insert private BinaryNode insertitem(object item, BinaryNode nodo, BinaryNode padre) { int result; if (nodo == null) { // fine ricerca posizione, definisco un nuovo nodo BinaryNode n = new BinaryNode(item); n.padre = padre; return n; else { //cerco posizione dove inserire l'elemento if ( (result = (Comparable) item).compareto(nodo.elemento) < 0 ) { nodo.figliosx = insertitem(item, nodo.figliosx, nodo); return nodo; else { if (result == 0) return nodo; else { nodo.figliodx = insertitem(item, nodo.figliodx, nodo); return nodo; 2001/2002 18

E6: alberi binari ricerca - delete La cancellazione deve preservare l ordine nell albero public void delete(object item) { //cerco il nodo che contiene item BinaryNode dacancellare = find(item); if (dacancellare == null) return; else deletenode(dacancellare); //cancello dall albero 2001/2002 19

E6: alberi binari ricerca - delete private void deletenode(binarynode dacancellare) { BinaryNode temp; if (dacancellare.figliosx == null) //non c'è il figlio sx, prendo il dx temp = dacancellare.figliodx; //(che può essere null) else { if (dacancellare.figliodx == null) //esiste solo figlio sx temp = dacancellare.figliosx; else { // ci sono entrambi i figli... if (dacancellare.figliosx.figliodx == null) { //se il figliosx ha solo figlios temp = dacancellare.figliosx; temp.figliodx = dacancellare.figliodx; //posso spostare il figliodx temp.figliodx.padre = temp; else { temp = inorderprec(dacancellare); //cerco nodo precedente nella //sequenza di visita in ordine 2001/2002 20

E6: alberi binari ricerca - delete dacancellare.elemento = temp.elemento; //scambio gli elementi deletenode(temp); //cancello il nodo temp temp = dacancellare; //allineo dacancellare e temp //per gli aggiustamenti successivi //ora si può fare la sostituzione if (dacancellare == radice) {//verifico che non sia root radice = temp; if (radice!= null) radice.padre = null; else { if (dacancellare.padre.figliosx == dacancellare) //dacancellare è figlio s dacancellare.padre.figliosx = temp; else dacancellare.padre.figliodx = temp; if (temp!= null) temp.padre = dacancellare.padre; 2001/2002 21

E6: alberi - Iteratori Iteratore struttura dati che permette di accedere a gli oggetti di una qualsiasi classe indipendentemente dall implementazione di questa in modo ordinato e per una sola volta. java.util.iterator è un interfaccia file://jdk1.3/docs/api/java/util/iterator.html definita dai seguenti metodi: boolean hasnext(); Object next(); void remove(); 2001/2002 22

E6: alberi - Iteratori Per l adt Albero gli Iteratori possono essere realizzati con i metodi di visita Esempio: public class TreeIterator implements java.util.iterator { private BinaryNode indice; private PilaArray nodidavisitare; TreeIterator(BinaryNode nodoinizio) { nodidavisitare.push(nodoinizio); 2001/2002 23

E6: alberi - Iteratori Esempio (continua): /** Deve restituire vero se ci sono ancora elementi da * visitare, falso altrimenti */ public boolean hasnext() { return (! nodidavisitare.evuota() ); 2001/2002 24

E6: alberi - Iteratori Esempio (continua): public Object next() throw java.util.nosuchelementexception { if (! nodidavisitare.evuota() ) { indice = nodidavisitare.pop(); if (indice.figliodx!=null) nodidavisitare.push(indice.figliodx); if (indice.figliosx!=null) nodidavisitare.push(indice.figliosx); return indice; else throws new java.util.nosuchelementexception(); 2001/2002 25

E6: alberi - Iteratori Definizione di un Iteratore per BinaryTree /*dentro definizione classe BinaryTree*/ public Iterator iterator() { return ( new TreeIterator(radice) ); 2001/2002 26

E6: alberi - compito esercitazione Compito dell esercitazione realizzare la classe Albero binario di ricerca con tutte le operazioni realizzare il metodo tostring() per la classe albero binario che stampi la struttura dell albero (Suggerimento: la stampa è più facile se è ruotata di 90 e se si visita l albero in un certo modo) Stampare l albero di ricerca che si ottiene con l inserimento di 2,1,4,10,3,7,11,11 e la cancellazione di 4 2001/2002 27