Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Alberi
Esercizio Scrivere un algoritmo che, dato in input un albero binario T i cui nodi sono etichettati con interi, visiti per livelli T
Visita per livelli VisitaLivello(T,l) if (T ≠ NIL) then if l = 0 then visita info[T] else l <- l - 1 VisitaLivello(left[T],l) VisitaLivello(right[T],l)
Visita per livelli VisitaLivelli(T) if (T ≠ NIL) then i = Profondita(T) for j <- 0 to i do VisitaLivello(T,j)
// definizione della struttura nodo typedef struct elem{ int info; struct elem* left; struct elem* right; } etree; // definizione del puntatore ai nodi dell’albero typedef etree* ptree; Alberi in C
void VisitaLivello(ptree p, int livello){ if (p != NULL) { if (livello == 0) printf("%d ",p->info); else { livello--; VisitaLivello(p->left,livello); VisitaLivello(p->right,livello); } Visita per livelli
void VisitaLivelli(ptree p){ if (p!= NULL) { printf("Visita per livelli: "); int i = Profondita(p); int j; for(j = 0; j <= i; j++) VisitaLivello(p,j); printf("\n"); } Visita per livelli
Esercizio Scrivere un algoritmo che, dato in input un albero binario T i cui nodi sono etichettati con interi, e dato un numero intero l, crei una lista collegata mediante puntatori che contiene tutte le etichette di T che si trovano al livello l, se esistono.
Lista livello ListaLivello(T, l, lista){ if T ≠ NIL then if (l = 0) then inserisciInCoda(lista,info[T]) else l-- ListaLivello(left[T],l,lista) ListaLivello(right[T],l,lista)
void ListaLivello(ptree p, int livello, plist *l){ if (p != NULL) { if (livello == 0) inserisciInCoda(l,p->info); else { livello--; ListaLivello(p->left,livello,l); ListaLivello(p->right,livello,l); } Lista Livello
Esercizio Un albero si definisce livellato crescente se la somma dei nodi delle etichette sul livello i è maggiore o uguale di quella a livello i+1 (per ogni i). Scrivere un algoritmo che, dato in input un albero binario T i cui nodi sono etichettati con interi, verifichi se questo albero è livellato crescente.
Livellato Crescente Crescente(T,somma,j,p) if (T = NIL) then return true else if j > p then return true else ListaLivello(T,j,l) s <- SUM(l) return s > somma and Crescente(T,s,j+1,p) LivCrescente(T) return Crescente(T,0,0,Profondita(T))
int Crescente(ptree T, int somma, int j, int p) { if (T == NULL) return 1; else { if (j > p) return 1; else{ plist l = NULL; ListaLivello(T,j,&l); int s = SUM(l); j++; return ((s > somma) && Crescente(T,s,j,p)); } int LivCrescente(ptree T) { return Crescente(T,0,0,Profondita(T)); } Livellato Crescente
Esercizio Scrivere un algoritmo che, dato in input un albero binario di ricerca T i cui nodi sono etichettati con interi, e un intero l, inserisca l in T mantenendo T un albero binario di ricerca.
Inserimento in ABR InsertABR(T,z) y <- NIL x <- head[T] while x ≠ NIL do y <- x if info[z] < info[x] then x <- left[x] else x <- right[x] if y = NIL then head[T] <- z else if info[z] < info[y] then left[y] <- z else right[y] <- z
int InsertABR(ptree *T, int z){ ptree y = NULL; ptree x = *T; while (x != NULL) { y = x; if (z info) x = x->left; else x = x->right; } ptree temp = (ptree)malloc(sizeof(etree)); temp->info=z; temp->left=NULL; temp->right=NULL; if (y == NULL) *T = temp; else if (z info) y->left = temp; else y->right=temp; } Inserimento in ABR
Esercizio Scrivere un algoritmo che, dato in input un albero binario T i cui nodi sono etichettati con interi, costruisca da T un albero binario di ricerca.
Crea ABR LivelloABR(T,l,ABR) if T ≠ NIL then if l = 0 then InsertABR(ABR,info[T]) else l-- LivelloABR(left[T],l,ABR) LivelloABR(right[T],l,ABR) CreaABR(T,ABR) if T ≠ NULL then i = Profondita(T) for j <- 0 to i LivelloABR(T,j,ABR)
void LivelloABR(ptree p, int livello, ptree *ABR){ if (p != NULL) { if (livello == 0) InsertABR(ABR,p->info); else { livello--; LivelloABR(p->left,livello,ABR); LivelloABR(p->right,livello,ABR); } Crea ABR
void CreaABR(ptree T,ptree* ABR){ if (T!= NULL) { int i = Profondita(T); int j; for(j = 0; j <= i; j++) LivelloABR(T,j,ABR); } Crea ABR
Corso di Algoritmi e strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su alberi FINE