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