Esercitazioni di Prog. II (esercizi su alberi ennari)

Slides:



Advertisements
Presentazioni simili
Ordinamento ottimo Ricerca
Advertisements

Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Esercizi su alberi binari
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
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.
CORSO DI PROGRAMMAZIONE II Operazioni su alberi ordinati e non
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
APPUNTI SUL LINGUAGGIO C
Albero: insieme di punti chiamati NODI e linee chiamate EDGES
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 alberi binari
Le liste dinamiche La ricorsione
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.
Esercizi su File.
Esercizi Liste.
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
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
Prog2 a.a. 2001/ Albero binario di ricerca Un albero binario di ricerca é un albero binario in cui ogni nodo ha un’etichetta.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi.
Prog21 Alberi binari (radicati e ordinati) Il figlio destro della radice La radice Il figlio sinistro della radice Il padre del nodo 5.
Fondamenti di Informatica A - Massimo Bertozzi ALBERI E ALBERI BINARI DI RICERCA (BST)
Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo.
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
Dizionari alberi bilanciati.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
Le postcondizioni specificano l’output della funzione.
CICLO DO – WHILE LINGUAGGIO C.
Esercitazioni di Prog. II (esercizi _aggiuntivi_su alberi binari)
Algoritmi e Strutture Dati
Dizionari alberi bilanciati.
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Alberi n-ary Lezioni di C.
Gestione di un banco di magliette
Gestione di un ristorante
APPUNTI SUL LINGUAGGIO C
Progettare algoritmi veloci usando strutture dati efficienti
esercizi alberi binari
APPUNTI SUL LINGUAGGIO C
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
APPUNTI SUL LINGUAGGIO C Esercizi sugli array e strutture
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C
comprensione e modifica di codice
LINGUAGGIO C Alberi e livelli
APPUNTI SUL LINGUAGGIO C Alberi Binari – primi esercizi
Esercizio Dato un albero binario, definiamo altezza minimale di un nodo v la minima distanza di v da una delle foglie del suo sottoalbero, definiamo invece.
Programmazione e Laboratorio di Programmazione
Fondamenti di Informatica
Algoritmi e Strutture dati a.a.2010/2011 Prof.ssa Rossella Petreschi
Verifica bilanciamento nel numero dei nodi: definizioni.
concetti ed applicazioni
Algoritmi e Strutture Dati
Programmazione e Laboratorio di Programmazione
HeapSort Stesso approccio incrementale del selectionSort Tipo di dato
Programmazione e Laboratorio di Programmazione
Transcript della presentazione:

Esercitazioni di Prog. II (esercizi su alberi ennari) Chiara Petrioli

Alberi N-ari #include <stdio.h> #include<stdlib.h> struct nodoalberon{ struct nodoalberon *fratello; int elem; struct nodoalberon *primofiglio; }; typedef struct nodoalberon TREENODEN; typedef TREENODEN *ALBERONARIO; /*costruzione di un albero nario inserito da input*/ ALBERONARIO creaalbero(); /*Verifica se l'albero e' vuoto*/ int alberonvuoto(ALBERONARIO); /*stampa in inorder i valori contenuti nell'albero*/ void stampapreordinealberon(ALBERONARIO); /*calcola il massimo valore contenuto in un albero n-ario non vuoto*/ int maxalberon(ALBERONARIO); /*verifica se un valore intero specificato sia o meno presente nell'albero */ int findalberon(ALBERONARIO, int);

Main main() { ALBERONARIO TT; int i; TT=creaalbero(); stampapreordinealberon(TT); printf("inserisci valore da ricercare \n"); scanf("%d",&i); if (findalberon(TT,i)) printf("il valore %d e' presente nell'albero\n",i); else printf("il valore %d non e' presente nell' albero \n",i); if (TT!=NULL) printf("il valore massimo contenuto nell'albero e':%d \n",maxalberon(TT)); }

<valore, numero di figli> Esercizio 1 /*Pre: l'albero che si costruisce e' NON vuoto*/ /*Post: costruisce in preordine un albero n-ario*/ ALBERONARIO creaalbero() { ALBERONARIO T, temp; int i,j,k; scanf("%d %d",&i,&j); T=malloc(sizeof(TREENODEN)); if (T==NULL) printf("memoria non allocata\n"); else T->elem=i; T->fratello=NULL; if (j==0) T->primofiglio=NULL; } T->primofiglio=creaalbero(); temp=T->primofiglio; for (k=0;k<j-1;k++) /* printf("entrato nel ciclo con i pari a %d\n",i);*/ temp->fratello=creaalbero(); /*printf("valore mio e del fratello %d %d\n",temp->elem, temp->fratello->elem);*/ temp=temp->fratello; return T; Si scriva una funzione che prenda da Inout coppie <valore, numero di figli> E costruisca un Albero in preordine Qui farli ragionare un attimo sull’aritmetica dei puntatori

Si scriva una procedura Albero n-ario lo stampi Esercizio 2 /*Post: stampa in preorder (prima la radice quindi il primo dei suoi sottoalberi, quindi il secondo dei suoi sottoalberi etc... i valori contenuti nei nodi dell'albero*/ void stampapreordinealberon(ALBERONARIO T) { ALBERONARIO temp; if (T!=NULL) printf("%d\n",T->elem); temp=T->primofiglio; while (temp!=NULL) stampapreordinealberon(temp); temp=temp->fratello; } return; Si scriva una procedura Che dato un Albero n-ario lo stampi In preordine Qui farli ragionare un attimo sull’aritmetica dei puntatori

Valore massimo contenuto Esercizio 3 /* Pre: albero non vuoto Post: restituisce il valore massimo contenuto nell'albero */ int maxalberon(ALBERONARIO T) { ALBERONARIO temp=T->primofiglio; int massimo = T->elem; int currmax; while (temp!=NULL) currmax=maxalberon(temp); if (currmax>massimo) massimo=currmax; temp=temp->fratello; } return massimo; Si scriva una funzione Che dato un Albero nario Calcoli il Valore massimo contenuto Nell’albero Qui farli ragionare un attimo sull’aritmetica dei puntatori

Esercizio 4 Si scriva una funzione Che dato un Albero n-ario ed un /*Post: restituisce i se il valore x e' contenuto nell'albero, 0 altrimenti */ int findalberon(ALBERONARIO T, int x) { ALBERONARIO temp; int trovato; if (T==NULL) return 0; if (T->elem==x) return 1; temp=T->primofiglio; trovato=0; while ((temp!=NULL)&& !trovato) if (findalberon(temp,x)) trovato=1; temp=temp->fratello; } return trovato; Si scriva una funzione Che dato un Albero n-ario ed un Intero x verifichi se x compare tra i valori contenuti Nell’albero Qui farli ragionare un attimo sull’aritmetica dei puntatori

Albero n-ario verifichi Esercizio 6 /* verifico se tutti gli elementi di un albero n-ario sono pari*/ int tutti_pari_P (Nodo * albero) { if (!albero) return 1; if (albero->valore % 2) return 0; else return (tutti_pari_P(albero->figlio) && tutti_pari_P(albero->fratello)); } Si scriva una funzione Che dato un Albero n-ario verifichi Se tutti i valori dei Suoi nodi sono pari Qui farli ragionare un attimo sull’aritmetica dei puntatori

Esercizio 7 Si scriva una funzione Che dato un Albero nario /* Post: restituisce l’altezza dell’albero generico */ int altezza(ALBERONARIO T) { ALBERONARIO temp; int altezza=0; int curralt; if (T==NULL) return 0; temp=T->primofiglio; while (temp!=NULL) curralt=altezza(temp); if (curralt>altezza) altezza=curralt; temp=temp->fratello; } return (altezza+1); Si scriva una funzione Che dato un Albero nario Calcoli la sua altezza Qui farli ragionare un attimo sull’aritmetica dei puntatori

Il numero delle sue foglie Esercizio 8 /* calcola il numero di foglie dell’albero generico*/ int numfoglie (ALBERONARIO T) { if (T==NULL) return 0; if (T->primofiglio ==NULL) return 1+ numfoglie(T->fratello); else return (numfoglie (T->primofiglio)+ numfoglie(T->fratello)); } Si scriva una funzione Che dato un Albero n-ario calcoli Il numero delle sue foglie Qui farli ragionare un attimo sull’aritmetica dei puntatori

Esercizio 9 Si scriva una funzione Che dato un Albero n-ario calcoli /* calcola il numero di nodi con k figli*/ int nodiKfigli (ALBERONARIO T, int k) { int k1=0; ALBERONARIO temp; if (T == NULL) return 0; else temp=T->primofiglio; while (temp!=NULL) k1++; temp = temp->fratello; } return ((k==k1)?(1+nodiKfigli(T->fratello)+nodiKfigli(T->primofiglio)): (nodiKfigli(T->fratello)+nodiKfigli(T->primofiglio)); Si scriva una funzione Che dato un Albero n-ario calcoli Il numero di nodi Con k figli Qui farli ragionare un attimo sull’aritmetica dei puntatori

Esercizio 10 /* Pre: valori dell’albero interi positivi; Post:Dato un albero generico contenente valori interi positivi diciamo che e’ “di ricerca” (definizione inventata al fine di Inventarsi un esercizio) se la radice ha un valore minore di tutti i valori memorizzati nell’albero radicato nella radice; i nodi del primo sottoalbero hanno valori maggiori della radice ma minori dei valori dei sottoalberi successivi; i nodi dell’i-esimo sottoalbero hanno valori maggiori della radice e dei primi i-1 sottoalberi e valori minori dei sottoalberi successivi (dal sottoalbero i+1 in poi) */ struct risposta { int ricerca; /*valore booleano che dice se l’albero e’ di ricerca*/ int massimo; /*massimo valore dell’albero*/ int minimo; /*minimo valore dell’albero*/ }; typedef struct risposta * RISPOSTAPTR; Qui farli ragionare un attimo sull’aritmetica dei puntatori Si scriva una funzione Che dato un Albero nario Verifichi se e’ ‘di ricerca’

Esercizio 10b RISPOSTAPTR gendiricerca(ALBERONARIO T) { ALBERONARIO temp; RISPOSTAPTR RIS; int currmax=T->elem; int currmin=T->elem; int ric=1; if (T==NULL) temp=malloc(sizeof(struct risposta)); temp->ricerca=1; temp->massimo=0; temp->minimo=0; return temp; } Si scriva una funzione Che dato un Albero nario Verifichi se e’ ‘di ricerca’ Qui farli ragionare un attimo sull’aritmetica dei puntatori

Esercizio 10c Si scriva una funzione Che dato un Albero nario temp=T->primofiglio; while (temp!=NULL) { RIS=gendiricerca(temp); ric=ric&&(RIS->ricerca)&&(currmax<RIS->minimo); if (currmax<RIS->massimo) currmax=RIS->massimo; if (currmin>RIS->minimo) currmin=RIS->minimo; temp=temp->fratello; } temp=malloc(sizeof(struct risposta)); temp->ricerca=ric; temp->massimo=currmax; temp->minimo=currmin; return temp; Si scriva una funzione Che dato un Albero nario Verifichi se e’ ‘di ricerca’ Qui pensare un attimo forse non puo’ accadere che RIS->minimo sia 0

Esercizio 11 Si scriva una funzione Che dato un Albero nario /* Si verifichi che ogni nodo pari abbia solo figli dispari */ int paridispari(ALBERONARIO T) { ALBERONARIO temp; int ris=1; if (T==NULL) return 1; if (T->elem%2) /*caso in cui il nodo e’ dispari*/ temp=T->primofiglio; while (temp!=NULL) ris=ris&&paridispari(temp); temp=temp->fratello; } return ris; else /*caso in cui il nodo radice e’ pari*/ ris=ris&&(temp->elem%2)&&paridispari(temp); Si scriva una funzione Che dato un Albero nario Verifichi se ogni nodo Pari ha solo Figli dispari Qui farli ragionare un attimo sull’aritmetica dei puntatori