Alberi binari Definizione della struttura dati: struct tree { };

Slides:



Advertisements
Presentazioni simili
Andrea Zandatutoraggio strutture dati STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°14 albero di ricerca binario.
Advertisements

Ordinamento ottimo Ricerca
Alberi binari Definizione Sottoalberi Padre, figli
Uso avanzato di C.
Tipi di dato astratti Lista, Pila, Coda, Albero.
Estendere i linguaggi: i tipi di dato astratti
Strutture dati lineari
Procedure e funzioni ricorsive
Algoritmi Avanzati Grafi e Alberi
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Code a priorità (Heap) Definizione
Strutture dati elementari
Alberi binari di ricerca
La ricorsione Simulazione. Il Main /* Programma che usa una funzione ricorsiva*/ #include #define MAX_N 8 main() int valore, dato; printf(Introduci n:
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Capitolo 3 Strutture dati elementari Algoritmi e Strutture Dati.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Esercizi su alberi binari
Tail recursion: esempio
Esercizi su alberi binari di ricerca
Esercizi su strutture dinamiche Fondamenti di Programmazione Canale AD a.a. 2009/2010.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea.
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 6 Il problema.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 6 Il problema.
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.
INTRODUZIONE ALLA PROGRAMMAZIONE STRUTTURATA
CORSO DI PROGRAMMAZIONE II Operazioni su alberi ordinati e non
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
tipo astratto, implementazione, algoritmi
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
Algoritmi e Strutture Dati
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 pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Esercizi su alberi binari
Le liste dinamiche La ricorsione
Fondamenti di Informatica
1.Scrivere una funzione per cercare un numero x in una lista circolare di interi. La funzione deve restituire NULL se il numero non esiste. 2.Scrivere.
Corso di informatica Athena – Periti Informatici
Esercizi Liste.
Esercizi su File e Liste
Grafi Rappresentazione mediante liste di adiacenza:
Tail recursion: esempio
Esercizi La distanza di hamming tra due interi x e y si definisce come il numero di posizioni nella rappresentazione binaria di x e y aventi bit differenti.
Esercizi su alberi binari di ricerca
Alberi binari Definizione della struttura dati: struct tree { };
Corso di Informatica 2 a.a. 2003/04 Lezione 6
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Alberi CORDA – Informatica A. Ferrari Testi da
alberi completamente sbilanciati
ALGORITMO Un algoritmo è un procedimento che risolve un determinato problema attraverso un numero finito di passi. Un formalismo che permette di rappresentare.
Capitolo 6 Alberi di ricerca Algoritmi e Strutture Dati.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
Algoritmi e Strutture Dati Strutture Dati Elementari.
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.
Compitino del 2004 Alberi Generici. Idea Si vuole un tipo di dato astratto che definisca una struttura ad albero in cui nodi e foglie hanno associato.
1 Un esempio con iteratore: le liste ordinate di interi.
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE ABACUS Ud1Strutture dati lineariTempi -Liste semplicemente puntate 3h+3h.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Esercitazioni di Prog. II (esercizi su alberi ennari)
Alberi n-ary Lezioni di C.
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Transcript della presentazione:

Alberi binari Definizione della struttura dati: struct tree { }; int dato; struct tree *sx, *dx; }; typedef struct tree tree;

Esercizi su alberi binari Scrivere una funzione che cerchi un intero k all'interno di un albero binario. Scrivere una funzione che restituisca il valore massimo contenuto nei nodi di un albero binario. Scrivere una funzione che effettui la visita in ordine di un albero binario utilizzando l'iterazione. Scrivere una funzione che verifichi se due alberi binari sono uguali NOTA: scrivere sempre pre e post condizione di ogni funzione

Esercizio 1 Scrivere una funzione che cerchi un intero k all'interno di un albero binario. Pre condizioni: La funzione prende in ingresso un albero binario e un intero k da cercare nei nodi dell’albero Post condizioni: La funzione restituisce 1 se k è contenuto in almeno un nodo, 0 altrimenti. Se l’albero è vuoto, la funzione restituisce 0.

Implementazione ricorsiva int ricerca(tree *t, int k) { if (t == NULL) return 0; return t->dato == k || ricerca(t->sx, k) || ricerca(t->dx, k); }

Esercizio 2 Scrivere una funzione che restituisca il valore massimo contenuto nei nodi di un albero. Pre condizioni: la funzione prende in ingresso un albero binario Post condizioni: La funzione restituisce il valore massimo tra quelli presenti nei nodi dell’albero, -1 se l’albero è vuoto.

Svolgimento int get_max(tree *t) { int max_sx, max_dx; #define max3(a,b,c) (a > b ? (c > a ? c : a) : (c > b ? c : b)) int get_max(tree *t) { int max_sx, max_dx; /* caso base: albero vuoto */ if (t == NULL) return -1; max_sx = get_max(t->sx); max_dx = get_max(t->dx); return max3(max_sx, max_dx, t->dato); } Esercizio analogo: restituire la profondità massima di un albero.

Esercizio 3 Scrivere una funzione che effettui la visita in ordine di un albero binario utilizzando l'iterazione. Pre condizioni: la funzione prende in ingresso un albero binario Post condizioni: la funzione stampa i valori associati ai nodi dell’albero “in ordine”

Svolgimento Ricordiamo l’implementazione ricorsiva della visita in ordine: void in_ordine(tree *t) { if (t != NULL) in_ordine(t->sx); printf(“%d”, t->dato); in_ordine(t->dx); }

Idea L’implementazione iterativa della visita in ordine è meno intuitiva: a) è necessario utilizzare una pila, b) si visita l’albero scendendo iterativamente verso sinistra e inserendo nella pila i nodi visitati, c) quando non ci sono più nodi a sinistra, se la pila è vuota, esci, d) si estrae il nodo in cima alla pila, lo si stampa e si scende a destra, e) si torna al passo (b).

Svolgimento void in_ordine(tree *t) { pila *p = crea_pila(); while(1) while(t != NULL) push(p, t); t = t->sx; } if (pila_vuota(p)) break; t = pop(p); printf(“%d”, t->dato); t = t->dx;

Esercizio 4 Scrivere una funzione che verifichi se due alberi binari sono uguali. Pre condizioni: la funzione prende in ingresso due alberi binari eventualmente vuoti Post condizioni: la funzione restituisce 1 se i due alberi hanno la stessa struttura e i medesimi contenuti

Svolgimento int uguali(tree *t1, tree *t2) { /* caso base: entrambi gli alberi vuoti */ if ((t1 == NULL)&&(t2 == NULL)) return 1; /* caso base: un albero vuoto, un albero no */ if ((t1 == NULL)||(t2 == NULL)) return 0; /* i due nodi in esame devono contenere lo stesso valore e i due sottoalberi sx e dx devono essere uguali ricorsivamente */ return t1->dato == t2->dato && uguali(t1->sx, t2->sx) && uguali(t1->dx, t2->dx); }

Alberi Generali Per rappresentare un albero n-ario, possiamo utilizzare un albero binario. Dato un nodo, i suoi due puntatori rappresentano il primo figlio del nodo e il prossimo fratello (ovvero il prossimo nodo con lo stesso padre del nodo in questione): struct gtree { int dato; struct gtree *first_child; struct gtree *next_brother; }; typedef struct gtree gtree;

Esercizio 5 Scrivere una funzione che effettui la visita in pre-ordine di un albero generale. Pre condizioni: la funzione prende in ingresso un albero generale Post condizioni: la funzione visita l’albero in pre-ordine stampando i valori dei nodi visitati.

Svolgimento void preorder(gtree *t) { while(t != NULL) printf(“%d”, t->dato); preorder(t->first_child); t = t->next_brother; } Questo esercizio è un ottimo esempio di miscela tra ricorsione (richiamiamo la funzione sul primo figlio) e iterazione (iteriamo la visita sui fratelli successivi del nodo in esame).