Alberi n-ary Lezioni di C.

Slides:



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

Ordinamento ottimo Ricerca
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.
Esercizi su alberi binari
Alberi binari Definizione della struttura dati: struct tree { };
Esercizi su alberi binari di ricerca
tipo astratto, implementazione, algoritmi
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
Tail recursion: esempio
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 completamente sbilanciati
Alberi Alberi radicati : alberi liberi in cui un vertice è stato scelto come radice. Alberi liberi : grafi non orientati connessi e senza cicli. Alberi.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Alberi.
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.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Soluzione esercizio.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Soluzione esercizio.
Capitolo 6 Il problema del dizionario Algoritmi e Strutture Dati.
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)
Huffman Canonico: approfondimento. Come abbiamo visto, Huffman canonico ci permette di ottenere una decompressione più veloce e con un uso più efficiente.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
Alberi. Gli alberi sono una generalizzazione delle liste che consente di modellare delle strutture gerarchiche come questa: Largo Fosco Dora Drogo Dudo.
Esercitazioni di Prog. II (esercizi su alberi ennari)
Progettare algoritmi veloci usando strutture dati efficienti
Progettare algoritmi veloci usando strutture dati efficienti
Il linguaggio C Strutture Moreno Marzolla
Dizionari alberi bilanciati.
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Alberi binari Definizione Sottoalberi Padre, figli
Rappresentazione di alberi
Le postcondizioni specificano l’output della funzione.
Esercitazioni di Prog. II (esercizi _aggiuntivi_su alberi binari)
K4 è planare? E K3,3 e K5 sono planari? Sì!
Algoritmi e Strutture Dati
Programmazione e Laboratorio di Programmazione
Programmazione e Laboratorio di Programmazione
Dizionari alberi bilanciati.
Programmazione e Laboratorio di Programmazione
Introduzione agli Algoritmi e alle Strutture Dati
Programmazione e Laboratorio di Programmazione
Algoritmi e Strutture Dati
Gestione di un banco di magliette
Gestione di un ristorante
APPUNTI SUL LINGUAGGIO C
Progettare algoritmi veloci usando strutture dati efficienti
comprensione e modifica di codice
APPUNTI SUL LINGUAGGIO C Implementazioni di Liste Concatenate
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Algoritmi e Strutture Dati
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
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
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:

Alberi n-ary Lezioni di C

Rappresentazione gerarchica L’albero e’ un tipo astratto di dati usato per rappresentare relazioni gerarchiche. struttura del file system albero genealogico organigramma albero di decisione ....

Codifica di una espressione

Rappresetazione di alberi Per gli alberi si possono avere 2 rappresentazioni: mediante array a puntatori Per rappresentare un albero binario di profondità n basta un array in cui riservare memoria per ogni nodo; nel caso di alberi sbilanciati i nodi mancanti avranno un valore di default (-1).

Implementazione in Array 2D

Rappresentazione a puntatori

Rappresentazione a puntatori Le foglie sono implementate come i nodi interni, quindi si spreca spazio per i puntatori nulli.

Albero n-ario Ogni nodo ha un numero arbitrario di figli Si usa ad esempio per rappresentare tassonomie e organizzazioni gerarchiche

Conversione in albero binario Il figlio di sinistra diventa sottoalbero sinistro; Il sottoalbero destro contiene il primo fratello verso destra

Con diverso numero di puntatori Ingestibile

Rappresentazione con 2 puntatori Il nodo è una struttura con 3 campi: Informazione Puntatore al primo figlio Puntatore al fratello destro

Rappresentazione con 3 puntatori

Struttura dati #ifndef NTree_h #define NTree_h #include <stdio.h> #include<stdlib.h> struct nodoalberon{ struct nodoalberon *fratello; int elem; struct nodoalberon *primofiglio; }; typedef struct nodoalberon TREENODEN; typedef TREENODEN *ALBERONARIO; #endif /* NTree_h */

Funzioni base /*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);

Funzione 1 Si scriva una funzione che prende da Input coppie <valore, numero di figli> e costruisce un albero in preordine /*Pre: l'albero che si costruisce e' NON vuoto*/ /*Post: costruisce in preordine un albero n-ario*/

Funzione 1 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");

Funzione 1 else { T->elem = i; T->fratello = NULL; if (j==0) T->primofiglio = NULL; T->primofiglio = creaalbero();

Funzione 1 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;

Funzione 2 Si scriva una procedura che dato un albero n-ario lo stampi in preordine /*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*/

Funzione 2 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;

Funzione 3 Si scriva una funzione che dato un albero n-ario calcoli il valore massimo contenuto nell’albero /* Pre: albero non vuoto */ /* Post: restituisce il valore massimo contenuto nell'albero */

Funzione 3 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;

Funzione 4 Si scriva una funzione che dato un albero n-ario ed un intero x verifichi se x compare tra i valori contenuti nell’albero /*Post: restituisce i se il valore x e' contenuto nell'albero, 0 altrimenti */

Funzione 4 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;

Funzione 5 Si scriva una funzione che dato un albero n-ario verifichi se tutti i valori dei suoi nodi sono pari

Funzione 5 /* verifico se tutti gli elementi di un albero n-ario sono pari*/ int tutti_pari_P (ALBERONARIO albero) { if (!albero) return 1; if (albero->elem % 2) return 0; else return (tutti_pari_P(albero->primofiglio) && tutti_pari_P(albero->fratello)); }

Funzione 6 Si scriva una funzione che dato un albero n-ario calcoli la sua altezza /* Post: restituisce l’altezza dell’albero generico */

Funzione 6 int altezza(ALBERONARIO T) { ALBERONARIO temp; int h=0; int curralt; if (T==NULL) return 0; temp=T->primofiglio; while (temp!=NULL) { curralt=altezza(temp); if (curralt > h) h=curralt; temp=temp->fratello; } return (h+1);

Funzione 7 Si scriva una funzione che dato un albero n-ario calcoli Il numero delle sue foglie

Funzione 7 /* 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)); }

Funzione 8 Si scriva una funzione che dato un albero n-ario calcoli il numero di nodi con k figli

Funzione 8 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; } if (k==k1) return 1+nodiKfigli(T->fratello,k)+ nodiKfigli(T->primofiglio,k); else return nodiKfigli(T->fratello,k)+nodiKfigli(T->primofiglio,k);

Funzione 9 Scrivere funzione che dato un albero N-ario verifichi se ogni nodo pari ha solo figli dispari

Funzione 9 int paridispari (ALBERONARIO T) { ALBERONARIO temp; int ris = 1; if (T == NULL) return 1; if (T->elem % 2) { /* caso in cui il nodo è dispari */ temp = T->primofiglio; while (temp != NULL) { ris = ris && paridispari(temp); temp = temp->fratello; } return ris;

Funzione 9 else { /* caso in cui il nodo radice è pari */ temp = T->primofiglio; while (temp != NULL){ ris = ris && (temp->elem % 2) && paridispari(temp); temp = temp->fratello; } return ris;