ricerca di un elemento, verifica dell appartenenza di un elemento

Documenti analoghi
ricerca di un elemento, verifica dell appartenenza di un elemento

Alberi. La definizione ricorsiva: Un albero radicato (non vuoto) è: o un singolo nodo o una radice connessa a un insieme di alberi.

Conteggio del numero di elementi: Inserimento di elementi in ordine: Provare l esempio: gcc -o list1 list1.c intlist.c

Alberi binari e alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Alberi binari e alberi binari di ricerca

Esercitazione 6. Alberi binari di ricerca

Per semplicità eliminiamo le ripetizioni nell'albero.

Struttura dati Dizionario

Alberi ed Alberi Binari di Ricerca

Strutture dati Alberi binari

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

Alberi ed Alberi Binari

Alberi Binari di Ricerca: Definizione. Ricerca, inserimento, cancellazione, min, max, predecessore, successore.

Struttura di dati che può essere usata sia come dizionario, sia come coda con priorità

Organigramma Gerarchia. (Tree) Nessuna persona può avere più di un superiore Ogni persona può essere superiore di altre

Esempi. Albero di interi. Struttura che non è un albero!

Alberi binari (radicati e ordinati) della radice Il padre del nodo 5 e del nodo 3

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

L albero e un tipo astratto di dati usato per rappresentare relazioni gerarchiche.

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

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

PROGRAMMAZIONE II canale A-D luglio 2008 TRACCIA DI SOLUZIONE

Alberi binari di ricerca

Lezione 12 Tabelle Hash

Alberi. CORDA Informatica. A. Ferrari. Testi da. Marco Bernardo Edoardo Bontà. Dispense del Corso di. Algoritmi e Strutture Dati

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Alberi binari di ricerca

ALBERI. Un Albero. Un grafo aciclico che non è un albero: due archi entranti in uno stesso nodo

Esercizio 1. E vero che in un AVL il minimo si trova in una foglia o nel penultimo livello? FB = -1. livello 0 FB = -1. livello 1 FB = -1.

Alberi binari di ricerca

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

Verificare se un albero binario è bilanciato

ALBERI : introduzione SOMMARIO ALBERI ALBERI. ALBERI: introduzione ALBERI BINARI: introduzione VISITE RICORSIVE DI ALBERI

Alberi. Alberi: Esempio di utilizzo

Algoritmi e strutture dati

Esame di Algoritmi e Strutture Dati Corso di Laurea in Ingegneria Informatica Canali A-L, M-Z

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

In questa lezione. Alberi binari: [CLRS09] cap. 12 per la visita inorder. visite e esercizi su alberi binari. Prof. E. Fachini - Intr. Alg.

Lezione 6: 12 Novembre 2013

Note per la Lezione 4 Ugo Vaccaro

Alberi Binari di Ricerca e Alberi Rosso-Neri

Divide et impera su alberi

In questa lezione Alberi binari di ricerca

ALGORITMI E STRUTTURE DATI

Laboratorio di Algoritmi

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Alberi di ricerca binari

Alberi. Se x è il genitore di y, allora y è un figlio di x. Un albero binario è un albero in cui ogni nodo ha al massimo due figli.

Alberi Binari di Ricerca

Algoritmi e Strutture Dati. Capitolo 6 Il problema del dizionario

Alberi rosso-neri. Oltre ad essere alberi binari di ricerca, gli alberi rosso-neri soddisfano le seguenti proprietà:

La lista concatenata è una struttura che organizza i dati in maniera sequenziale.

Dizionari. Realizzazione con alberi binari di ricerca. Alberi rosso-neri. Ugo de' Liguoro - Algoritmi e Seprimentazioni 03/04 Lez.

d. Cancellazione del valore 5 e. Inserimento del valore 1

Indice come albero binario di ricerca!

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Fondamenti teorici e programmazione

Lezione 9 Alberi binari di ricerca

Moltiplicazione veloce di interi

Implementazione dell albero binario in linguaggio C++

Esercizi su ABR. Prof. E. Fachini - Intr. Alg.!1

Un esempio di mutua ricorsione

Liste, Alberi, Grafi 1

Dati e Algoritmi 1: A. Pietracaprina. Alberi Binari

Laboratorio di Informatica. Lezione 8: Liste e alberi

Algoritmi e Strutture Dati. Lezione 3

Alberi binari. Un albero binario è un albero con radice in cui ogni nodo ha al massimo due figli, chiamati figlio sinistro e figlio destro.

Esercizi BST - AVL. E. Fachini

Laboratorio di algoritmi e strutture dati

Alberi Binari di Ricerca

Alberi. Definizioni principali

Esercitazione 5 Alberi Binari di Ricerca

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

Alberi n-ari: specifiche sintattiche e semantiche. Realizzazioni. Visita di alberi n-ari.

Algoritmi, Strutture Dati e Programmi. UD 3.d: Strutture Dati Dinamiche Alberi

Esercizi parte 3. La classe ArrayBinTree dovra implementare, tra le altre, l operazione seguente: padre: dato un nodo, restituire l indice del padre.

Algoritmo di ordinamento sul posto che ha tempo di esecuzione :

Algoritmi e Strutture di Dati

Alberi. Dalla semplicità della definizione ricorsiva consegue la semplicità di scrittura di algoritmi ricorsivi per la manipolazione di alberi.

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

algoritmi e strutture di dati

Ripasso di programmazione ricorsiva

Laboratorio di algoritmi e strutture dati

Algoritmi e Strutture Dati

Esercitazione su Albero Binario

Esercizi su programmazione ricorsiva 3

Algoritmi e Strutture Dati. Capitolo 3 Strutture dati elementari

23/10/2016. gli alberi. alcune definizioni. un esempio. LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica.

Strutture dati dinamiche in C (II)

now is the for men all good come aid

Lezione 7 Alberi binari: visite e alberi di ricerca

In questa lezione Alberi binari di ricerca: la cancellazione

Problemi di ordinamento

Prova di Algoritmi e s.d. (1o anno) 17 Settembre TESTO e RISPOSTE

Tutoraggio Informatica Generale Inserimento e cancellazione in un ABR Counting Sort

Algoritmi e strutture dati

Indici multilivello dinamici (B-alberi e B + -alberi) Alberi di ricerca - 1. Un esempio. Alberi di ricerca - 3. Alberi di ricerca - 2

Transcript:

Alberi Binari di Ricerca Gli alberi binari di ricerca (o, alberi di ricerca binaria) sono strutture dati che consentono, su un insieme di elementi con un ordine totale le operazioni di: ricerca di un elemento, verifica dell appartenenza di un elemento a un sottoinsieme. inserimento e cancellazione di elementi. reperimento del minimo e del massimo elemento di un sottoinsieme. determinazione del successore e del predecessore di un elemento in un sottoinsieme. 1

Definizione: Sia < A, > un insieme totalmente ordinato e sia S A. Un albero di ricerca binaria per S è un albero binario T i cui nodi sono etichettati da elementi di S. Inoltre, detta E(v) l etichetta del nodo v di T valgono le seguenti: per ogni elemento s di S esiste uno e un solo v tale che E(v) = s. per ogni nodo v di T, se u appartiene al sottoalbero destro di v, allora E(v) < E(u). per ogni nodo v di T, se u appartiene al sottoalbero sinistro di v, allora E(v) > E(u). 2

Implementazione Assumiamo che l insieme A delle etichette (chiavi) siano gli interi. Collochiamo nel file searchtree.h la seguente typedef typedef int key; Rappresenteremo i nodi dell albero utilizzando una struct con tre campi puntatore: oltre ai puntatori left e right ai sottoalberi sinistro e destro, memorizzeremo nel puntatore up l indirizzo del nodo padre. struct searchtree key v; struct searchtree *left, *right, *up; ; typedef struct searchtree searchtree; 3

Ovviamente, oltre alla chiave, un nodo può contenere altre informazioni, che possono essere rappresentate aggiungendo nuovi campi membro o campi puntatore alla struttura searchtree. Ad esempio, se ogni nodo deve essere associato a una stringa nome, modificheremo come segue la nostra definizione della struttura searchtree: struct searchtree key v; char *nome; struct searchtree *left, *right, *up; ; NOTA: l implementazione discussa gestisce senza problemi alberi binari di ricerca in cui i valori per il campo key v possano trovarsi ripetuti in nodi distinti. 4

Operazioni sugli alberi binari di ricerca Essendo a tutti gli effetti degli alberi binari, l implementazione delle visite inorder, preorder, postorder, level-order può essere mutuata dalle corrispondenti funzioni per alberi binari generici: void inorder(searchtree *p, void (*op)(searchtree *)) if(p) inorder(p->left,op); (*op)(p); inorder(p->right,op); La visita in ordine simmetrico di un albero di ricerca binaria produce un elenco ordinato delle etichette (chiavi) dell albero. Chiaramente, la visita in ordine di un albero con n nodi richiede Θ(n) passi. 5

Ricerca di una chiave in un albero: searchtree *search(searchtree *p, key k) if(!p k == p->v) return search(k < p->v? p->left : p->right, k); search ritorna NULL se l albero con radice p non contiene alcun nodo con chiave k, altrimenti ritorna un puntatore al (nodo più a sinistra) con chiave k. search sfrutta in modo essenziale le proprietà definitorie di un albero di ricerca binaria: ricorsivamente viene esaminato il sottoalbero sinistro se k < p->v, il sottoalbero destro altrimenti. Il tempo di esecuzione è O(h) dove h è l altezza dell albero. 6

Un esercizio di ripasso sull operatore ternario? : Versioni alternative di search: searchtree *search2ndvers(searchtree *p, key k) if(!p k == p->v) return k < p->v? search2ndvers(p->left,k) : search2ndvers(p->right,k); searchtree *search3rdvers(searchtree *p, key k) if(!p k == p->v) if(k < p->v) return search3rdvers(p->left,k); else return search3rdvers(p->right,k); Eccone una versione iterativa: searchtree *itsearch(searchtree *p, key k) while(p && k!= p->v) p = k < p->v? p->left : p->right; 7

Anche le operazioni di estrazione del minimo e del massimo elemento richiedono O(h) passi, per h l altezza dell albero: Semplicemente, per trovare il minimo si seguono solo i puntatori left: searchtree *treemin(searchtree *p) for(;p->left;p = p->left); mentre per trovare il massimo si seguono solo i puntatori right: searchtree *treemax(searchtree *p) for(;p->right;p = p->right); 8

Successore e Predecessore Per trovare il successore di una chiave in un albero, non è necessario passare la radice dell albero stesso alla funzione: l unico parametro è un puntatore al nodo di cui si vuole ottenere il successore: searchtree *treesucc(searchtree *q) searchtree *qq; if(q->right) return treemin(q->right); qq = q->up; while(qq && q == qq->right) q = qq; qq = qq->up; return qq; treesucc restituisce il puntatore al nodo successore oppure NULL se tale nodo non esiste. 9

Il codice di treesucc è suddiviso in due casi: if(q->right) return treemin(q->right); Se il sottoalbero destro di q non è vuoto, il successore di q è il nodo più a sinistra del sottoalbero destro: tale nodo viene restituito da treemin(q->right). qq = q->up; while(qq && q == qq->right) q = qq; qq = qq->up; return qq; Altrimenti, se il successore esiste, allora deve essere l antenato più prossimo di q il cui figlio sinistro è pure antenato di q. Per determinarlo, qq punta al padre di q; la scansione fa risalire q e qq, fino a quando non si trova un antenato con le proprietà desiderate: essere figlio sinistro del padre. 10

La funzione treepred che restituisce, se esiste, il puntatore al predecessore del nodo passato come parametro, è la duale di treesucc. searchtree *treepred(searchtree *q) searchtree *qq; if(q->left) return treemax(q->left); qq = q->up; while(qq && q == qq->left) q = qq; qq = qq->up; return qq; treesucc e treepred richiedono tempo O(h). NOTA: Se un nodo ha due figli, allora il suo successore non ha figlio sinistro e il suo predecessore non ha figlio destro. 11