Alberi binari. Esercizi su alberi binari

Documenti analoghi
Alberi ed Alberi Binari

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

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Esercitazione 6. Alberi binari di ricerca

Note per la Lezione 4 Ugo Vaccaro

Per semplicità eliminiamo le ripetizioni nell'albero.

Strutture dati dinamiche in C (II)

Verificare se un albero binario è bilanciato

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

Alberi binari e alberi binari di ricerca

Laboratorio di Algoritmi e Strutture Dati. Aniello Murano. people.na.infn.it/~murano/ Murano Aniello - Lab. di ASD Terza Lezione

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Alberi Binari di Ricerca

Alberi binari di ricerca

La struttura dati ad albero binario

ADT Coda con priorità

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

Esercizi Capitolo 6 - Alberi binari di ricerca

lezione 9 min-heap binario Heap e Alberi posizionali generali

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Programmazione I - Laboratorio

Laboratorio 07. Programmazione - CdS Matematica. Michele Donini 10 dicembre 2015

Esercitazioni di Algoritmi e Strutture Dati

Alberto Montresor Università di Trento

Esercizi di Algoritmi e Strutture Dati

In questa lezione Strutture dati elementari: Pila Coda

Esercizi di Algoritmi e Strutture Dati

Linguaggio C. Esercizio 1

Algoritmi e Strutture Dati. HeapSort

Informatica 1. Prova di recupero 21 Settembre 2001

Lezione 9 Alberi binari di ricerca

Algoritmi e Strutture Dati

LISTE, INSIEMI, ALBERI E RICORSIONE

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

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

Heap e code di priorità

Roadmap. Ricorsione: funzioni ricorsive. Definizione di fattoriale. Definizione dei numeri Fibonacci

b. (10 punti) restituisca una lista denominata

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Esercitazione: Implementazione in linguaggio C dell ADT. Stack con l utilizzo. di linked list

PROGRAMMI LINGUAGGIO C

Esercitazione 12. Esercizi di Ricapitolazione

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

La struttura dati CODA

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Gestione dei file. File di testo e binari

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Costo di esecuzione e complessità. Modello di costo e complessità di un algoritmo

Da infissa a Postfissa

Corso di Informatica 1 (IN1) Tutorato n. 11

Compito di Fondamenti di Informatica

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

Esercizi proposti 10

Dati e Algoritmi I (Pietracaprina) Esercizi sugli Alberi

Liste con sentinella. intlist *createlist(void){ intlist *q = malloc(sizeof(intlist)); if(!q) { exit(-1); } q->next = q->prev = q; return q; }

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Lezione 6 Selection/Insertion Sort su interi e stringhe

I tipi di dato astratti

PILE E CODE. Pile (stack):

Laboratorio di Algoritmi e Strutture Dati

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Puntatori a Funzioni e Callback. Massimo Benerecetti

INDICI PER FILE. Accesso secondario. Strutture ausiliarie di accesso

alberi binari di ricerca (BST)

Programmazione 1 A.A. 2015/2016

alberi binari e ricorsione

Esempio di Prova Scritta

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

Transcript:

Alberi binari Definizione della struttura dati: struct tree int dato; struct tree *sx, *dx; ; typedef struct tree tree; Esercizi su alberi binari 1. Scrivere una funzione che cerchi un intero k all'interno di un albero binario. 2. Scrivere una funzione che restituisca il valore massimo contenuto nei nodi di un albero binario. 3. Scrivere una funzione che effettui la visita in ordine di un albero binario utilizzando l'iterazione. 4. Scrivere una funzione che verifichi se due alberi binari sono uguali 5. Scrivere una funzione che, dato un albero, inserisca in una lista solo i nodi di livello pari 6. Scrivere una funzione che, dato un albero che rappresenta una espressione (es. (1+2)*5), ne calcoli il valore e lo restituisca in output Scrivere sempre pre e post condizione di ogni funzione 1

Esercizio 1 Scrivere una funzione che cerchi un intero k all'interno di un albero binario. La funzione prende in ingresso un albero binario e un intero k da cercare nei nodi dell albero 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); 2

Esercizio 2 Scrivere una funzione che restituisca il valore massimo contenuto nei nodi di un albero. la funzione prende in ingresso un albero binario La funzione restituisce il valore massimo tra quelli presenti nei nodi dell albero, -1 se l albero è vuoto. Svolgimento #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. 3

Esercizio 3 Scrivere una funzione che effettui la visita in ordine di un albero binario utilizzando l'iterazione. la funzione prende in ingresso un albero binario la funzione stampa i valori associati ai nodi dell albero in ordine Svolgimento Ricordiamo l implementazione ricorsiva della visita in ordine: ( t * void in_ordine(tree ( NULL if (t!= in_ordine(t->sx); printf( %d, t->dato); in_ordine(t->dx); 4

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; 5

Esercizio 4 Scrivere una funzione che verifichi se due alberi binari sono uguali. la funzione prende in ingresso due alberi binari eventualmente vuoti 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); 6

Esercizio 5 Scrivere una funzione che, dato un albero in input, inserisca in una lista solo i nodi di livello pari. La funzione prende in ingresso un albero binario e un puntatore a puntatore a una lista La funzione imposta i nodi di livello pari nella lista. Implementazione void attraversa_pari(tree *t, list **l); void attraversa_dispari(tree *t, list **l) if (t == NULL) return; attraversa_pari(t->sx, l); attraversa_pari(t->dx, l); void attraversa_pari(tree *t, list **l) list *nuovo; if (t == NULL) return; nuovo = (list *)malloc(sizeof(list)); nuovo->next = *l; nuovo->dato = (void *)t->dato; *l = nuovo; attraversa_dispari(t->sx, l); attraversa_dispari(t->dx, l); 7

Esercizio 6 Scrivere una funzione che, dato un albero che rappresenta una espressione (es. (1+2)*5), ne calcoli il valore e lo restituisca in output. Nota: I nodi intermedi rappresentano gli operatori, le foglie dell'albero rappresentano gli operandi La funzione prende in ingresso un albero binario che rappresenta un'espressione (si suppone che l'albero codifichi correttamente l'espressione) La funzione restituisce il valore dell'espressione. Implementazione int get_value(tree *t) int val_sx, val_dx; /* foglia: intero */ if (t->sx == NULL && t->dx == NULL)return t->val; /* nodo intermedio: operatore val_sx = get_value(t->sx); val_dx = get_value(t->dx); switch(t->val) case '+': return val_sx+val_dx; case '-': return val_sx-val_dx; case '*': return val_sx*val_dx; case '/': return val_sx/val_dx; printf( espressione mal formata! ); return -1; 8