Estructures de dades arborescents

Documentos relacionados
DIBUIX TÈCNIC PER A CICLE SUPERIOR DE PRIMÀRIA

VECTORS I RECTES AL PLA. Exercici 1 Tenint en compte quin és l'origen i quin és l'extrem, anomena els següents vectors: D

1. SISTEMA D EQUACIONS LINEALS

UNITAT DONAR FORMAT A UNA PRESENTACIÓ

La creació de qualsevol llista es fa amb l operador list. En el cas de crear una llista buida la sintaxi és

operacions inverses índex base Per a unificar ambdues operacions, es defineix la potència d'exponent fraccionari:

CONSULTA DE L ESTAT DE FACTURES

2. FUNCIONS MATEMÀTIQUES, TRIGO- NOMÈTRIQUES I ESTADÍSTIQUES

Qüestionari (Adreçament IP)

Guia per a la construcció de webs de la Generalitat amb estil gencat responsiu

5.- Quan fem un clic sobre Nou treball accedim a la següent finestra que ens permet definir els diferents aspectes del nou treball: Nom : Nom del

Un sistema lineal de dues equacions amb dues incògnites és un conjunt de dues equacions que podem representar de la manera:

FUNCIONS REALS. MATEMÀTIQUES-1

3. FUNCIONS DE RECERCA I REFERÈN- CIA

CARTES DE FRACCIONS. Materials pel Taller de Matemàtiques

Activitats de repàs DIVISIBILITAT

U.D. 4: LES ESCALES QUADERN DE CLASSE. Nom i Cognoms: Curs i Grup: Data d'inici: Data de finalització:

Implementación de las Clases Pila, Cola, Lista y Arbol

Institut d Estudis Catalans. Programa del «Diccionari de Ciència i Tecnologia» Secció de Ciències i Tecnologia

AVALUACIÓ DE QUART D ESO

Problema Master mind. Extracte de solució

Guia d utilització de les opcions de cerca del Vocabulari forestal

h.itkur MD- Grafs 0-1/6

UNITAT LES REFERÈNCIES EN L ÚS DELS CÀLCULS

DIVISIBILITAT. Amb els nombres 5, 7 i 35 podem escriure diverses expressions matemàtiques: 5x7=

TEMA 2: Múltiples i Divisors

TEMA 3 : Nombres Racionals. Teoria

Resultat final, sense desenvolupar, dels exercicis i problemes proposats de cada unitat i de l apartat Resolució de problemes. En queden exclosos

Nom i Cognoms: Grup: Data:

El llenguatge HTML (Descripció i etiquetes) L etiqueta <table> (Creació de taules) Exemple complet de codi HTML... 5

ABCÇDEFGHIJKLMNOPQRSTUVWXYZ abcçdefghijklmnopqrstuvwxyz (.,:;?! '-*) àéèïíóòúü

Manual gestió d usuaris

MÚLTIPLES I DIVISORS

3. DIAPOSITIVA D ORGANIGRAMA I DIAGRAMA

SOLUCIONS DE LES ACTIVITATS D APRENENTATGE

Sèrie 5. Resolució: 1. Siguin i les rectes de d equacions. a) Estudieu el paral lelisme i la perpendicularitat entre les rectes i.

Clic de sons i nombres

Aquesta eina es treballa des de la banda de pestanyes Inserció, dins la barra d eines Il lustracions.

GUIÓ DE L ACTIVITAT ELS AMICS D UN NÚMERO. Material: Multicubs, llapis de colors, fulls quadriculats

Unitat 2 TEOREMA DE TALES. TEOREMA DE PITÀGORES. RAONS TRIGONOMÈTRIQUES UNITAT 2 TEOREMA DE TALES.

TEMA 2: Múltiples i Divisors. Activitats. 25 NO és múltiple de 3 perquè no hi ha cap nombre que multiplicat per 3 ens doni 25

Càlcul de tants efectius

Geogebra és un programa de llicència lliure i multiplataforma per l aprenentatge i ensenyament de les matemàtiques a tots els nivells.

ACTIVITATS. a) b) c) d) INS JÚLIA MINGUELL 2n Batxillerat. dv, 18 de març Alumne:

UNITAT DONAR FORMAT A UN DOCUMENT

UNITAT FUNCIONS D ÚS AVANÇAT

Unitat 2 EQUACIONS DE PRIMER GRAU. Matemàtiques, Ciència i Tecnologia 5. TRANSFORMACIONS D EXPRESSIONS ALGEBRAIQUES UNITAT 2 EQUACIONS DE PRIMER GRAU

Tema 1: TRIGONOMETRIA

Estructuras de Datos Lineales y Arborescentes

Isidre Guixà i Miranda Estructures de dades dinàmiques

TEORIA I QÜESTIONARIS

TEMA 1: Divisibilitat. Teoria

Creació d un bloc a XTEC Blocs: publicació i edició de vídeo amb YouTube Josep Cañas

TEMA1: L ORGANITZACIÓ DEL NOSTRE COS

Com és la Lluna? 1 Com és la Lluna? F I T X A D I D À C T I C A 4

UNITAT COMBINAR CORRESPONDÈNCIA

MINIGUIA RALC: REGISTRE D UN NOU ALUMNE (Només per a ensenyaments no sostinguts amb fons públics)

SOLUCIONS DE LES ACTIVITATS D APRENENTATGE

MANUAL D ÚS EDITOR DE PROJECTES D ESCOLES + SOSTENIBLES

Rol Nom de la variable Clau Cuiner APP_CHEF_KEY 0001 Cambrer APP_WAITER_KEY 0002 Encarregat APP_BOSS_KEY 0003

CMAPTOOLS. INICI 1. Comencem fent clic a la icona: O anem al menú inici, programes i busquem:

FUNCIONS EXPONENCIALS I LOGARÍTMIQUES. MATEMÀTIQUES-1

Connexió mitjançant la VPN a la xarxa de la Universitat de València en Windows 10

Aproximar un nombre decimal consisteix a reduir-lo a un altre nombre decimal exacte el valor del qual sigui molt pròxim al seu.

L ENTRENAMENT ESPORTIU

CONEIXEMENT DEL MEDI NATURAL,SOCIAL I CULTURAL

TEMA 3: Polinomis 3.1 DEFINICIONS:

ESTUDI DE LA CÈL LULA: FORMA, MIDA I CONTINGUT. Nom i cognoms: Curs i grup:

ÍNDEX 1 DEFINICIÓ 2 PER A QUÈ SERVEIX 3 COM ES REPRESENTA 4 PRIMER CONCEPTE 5 ESCALA DE REDUCCIÓ I ESCALA D AMPLIACIÓ 6 PROCEDIMENT DE CÀLCUL

Teoria de grafs M1 - FIB

Oració subordinada adjectiva: funció en l oració

2 = = + Es tracta de calcular: CÁLCUL DE LÍMITS ( I ) Resolució: Límits de successions : un quocient de polinomis

Oficina d Organització de Proves d Accés a la Universitat Pàgina 1 de 10 PAU 2010

GCompris (conjunt de jocs educatius)

Geometria / GE 2. Perpendicularitat S. Xambó

Els nombres naturals

El correu brossa és l enviament massiu i intencionat de correus electrònics a persones que no volen rebre aquests missatges.

LA LLUM. TEORIA I EXERCICIS (3)

El tramvia arriba a Badalona

UNITAT 8. FIGURES PLANES

Variació periòdica de les propietats dels elements

Polinomis i fraccions algèbriques

UNITAT 3: SISTEMES D EQUACIONS

1R DE PRIMÀRIA ESCOLA PÚBLICA ROCAFONDA

Servei de Gestió de Serveis Informàtics Secció de Sistemes en Explotació Webmailaj Correu Municipal Configuració nou compte de correu

La Noa va de càmping, quina llet ha de triar?

EDUCACIÓ VIÀRIA A 4t CURS D EDUCACIÓ PRIMÀRIA

typedef struct { tipus_1 camp_1; tipus_n camp_n; } nom_tipus; typedef struct { float x; float y; } t_punt; t_punt p = {1,1}; p.x = 2; p.

Centre d Ensenyament Online (CEO)

El viatge multimèdia: de la foto al clip multimèdia P08/93143/01581

TEMA 5: Sistema mètric decimal

Les funcions que apliquen a tots els elements del domini la mateixa imatge es diu funció constant, evidentment han d ésser del tipus f(x) = k (k R)

En uns moments, ens demanará un nom d usuari i una contrasenya. Aquestes dades les proporciona l administrador de la xarxa de la confraria.

Manual de configuració comptes de en centres educatius

Administrar comptes d'usuari en Windows 7

Els nombres enters són els que permeten comptar tant els objectes que es tenen com els objectes que es deuen.

Tema 2. Els aparells de comandament elèctrics.

PROVA D APTITUD PERSONAL ACCÉS ALS GRAUS EDUCACIÓ INFANTIL I EDUCACIÓ PRIMÀRIA

Veure que tot nombre cub s obté com a suma de senars consecutius.

Transcripción:

Estructures de dades arborescents R. Ferrer i Cancho Universitat Politècnica de Catalunya PRO2 (curs 2010-2011) Versió 0.3 Avís: aquesta presentació no pretén ser un substitut dels apunts ocials de l'assignatura.

On som? Tema 3: Estructures de dades arborescents. 4a sessió Avui Mes enllà d'estructures de dades lineals (piles, cues, llistes) Estructures de dades arborescents (diferents menes d'arbres).

Recorreguts en profunditat Recorreguts en amplada

Estructures de dades arborescents Estructures de dades lineals enfront arborescents: Estructura de dades lineal: un element només pot tenir (pel cap alt) un successor Estructura de dades arborescent: un element pot tenir pot tenir més d'un element successor. Metàfora de l'arbre (arrel, fulles, alçada). Diferència amb arbres reals: arrel a dalt / fulles a sota

Conceptes d'arbres I

Conceptes d'arbres II Node: element d'un arbre Arbre buit: arbre que no té cap element Arrel: element de tot arbre no buit únic consultable individualment node arrel està connectat a zero o més (sub)arbres. Fill: subarbre (consultable individualment). Fulles: nodes sense cap successor Camí: successió de nodes que van de l'arrel a una fulla. Alçada: longitud del camí més llarg.

Exemple d'un arbre general

Arbres N-aris Tipus d'arbre on tots els subarbres no buits tenen exactament el mateix nombre de lls, siguin aquests lls arbres buits o no. N: nombre de lls

Exemple d'arbre 4-ari Quadrats negres: arbres buits. Per claredat convé representar explícitament els arbres buits en els arbres N-aris.

Arbres binaris Cas particular dels arbre N-aris, on N = 2. Quan diem arbres sense detallar més, ens referim per defecte a arbres binaris.

Exemple d'un arbre binari I No hem dibuixat els subarbres buits amb caixes negres com en l'exemple d'arbre 4-ari

Exemple d'un arbre binari II Arrel de l'arbre: 1. L'arrel té dos lls: Subarbre esquerre: té com a arrel 2 Subarbre dret: té com a arrel 3. Tots els nodes tenen dos lls. Si els dos lls són arbres buits, els nodes es diuen fulles. Els nodes que contenen 4, 8, 9, 10 i 7 són fulles. Els arbres buits no estan representats.

Especicació de la classe genèrica arbre binari (Arbre) Veure document: especicacions_estructures_dades_arborescents.pdf Instanciació: Arbre<tipus> Exemples: nom_arbre; Arbre<int> a; Arbre<Estudiant> b;. Atenció: coherència entre el valor de T a l'arbre del p.i. i el dels paràmetres explícits. void plantar(const T& x, Arbre& a1, Arbre& a2);

Ús d'arbres binaris Cassicació en tipus d'algorismes (vista en sessions anterios): algorismes d'exploració (no operació plantar) algorismes de modicació (operació plantar) algorismes de creació o generació (operació plantar).

I Exploració d'un arbre. Només es calcula una propietat de la estructura de l'arbre, No es fa servir l'operació arrel (no es consulta en cap moment el contingut dels nodes). Especicació int altura(arbre<int>& a) /* Pre: a = A */ {... /* Post: El resultat és la longitud del camí més llarg de l'arrel de l'arbre A */ Versió recursiva.

II int altura(arbre<int>& a) /* Pre: a=a */ { int x; if (a.es_buit()) x = 0; else{ Arbre<int> a1, a2; a.fills(a1, a2); int y = altura(a1); int z = altura(a2); if (y>=z) x = y + 1; else x = z + 1; return x; /* Post: El resultat és la longitud del camí més llarg de l'arrel a una fulla de l'arbre A */ Què li ha passat al paràmetre "a"?

Exercici: mida d'un arbre int mida(arbre<int>& a) /* Pre: a = A */ {... /* Post: El resultat és el nombre de nodes de l'arbre A */ Versió recursiva

Mida d'un arbre: solució int mida(arbre<int>& a) /* Pre: a=a */ { int x; if (a.es_buit()) x = 0; else{ Arbre<int> a1, a2; a.fills(a1, a2); int y = mida(a1); int z = mida(a2); x = y + z + 1; return x; /* Post: El resultat és el nombre de nodes de l'arbre A */

Cerca d'un valor int en un arbre de int Exploració però No cal visitar tots els nodes de l'arbre Cal consultar el contingut dels nodes que visitem. bool cerca(arbre<int>& a, int x) /* Pre: a = A */ {... /* Post: El resultat indica si x és a l'arbre A o no */ Versió recursiva

Solució bool cerca(arbre<int>& a, int x) /* Pre: a = A */ { bool b; if (a.es_buit()) b=false; else if (a.arrel()==x) b=true; else{ Arbre<int> a1, a2; a.fills(a1, a2); b = cerca(a1, x); if (not b) b=cerca(a2, x); return b; /* Post: El resultat indica si x és a l'arbre A o no */

Suma d'un valor k a tots els nodes d'un arbre d'int. Dues solucions recursives: Versió acció. Versió funció.

Versió acció I En el cas base, quan l'arbre és buit, l'arbre modicat és ell mateix i no cal fer res. Per tant, només hi ha el cas recursiu (explícitament en el codi). Especicació void suma(arbre<int> &a, int k) /* Pre: a = A */ {... /* Post: El valor de cada node d'a és la suma del valor del node corresponent d'a i el valor k */

Versió acció II void suma(arbre<int> &a, int k) /* Pre: a = A */ { if (not a.es_buit()) { int n = a.arrel() + k; Arbre<int> a1, a2; a.fills(a1, a2); suma(a1, k); suma(a2, k); a.plantar(n, a1, a2); /* Post: El valor de cada node d'a és la suma del valor del node corresponent d'a i el valor k */

Versió funció I L'arbre resultat s'ha d'anar generant. Els arbres acabats de crear són buits no ens cal un cas base explícit. Especicació: Arbre<int> suma(arbre<int> &a, int k) /* Pre: a=a */ {... /* Post: El valor de cada node del resultat és la suma del valor del node corresponent d'a i el valor k */

Versió funció II Arbre<int> suma(arbre<int> &a, int k) /* Pre: a=a */ { Arbre<int> b; if (not a.es_buit()){ int n = a.arrel() + k; Arbre<int> a1, a2; a.fills(a1, a2); a1 = suma(a1, k); a2 = suma(a2, k); b.plantar(n, a1, a2); return b; /* Post: El valor de cada node del resultat és la suma del valor del node corresponent d'a i el valor k */

Recorreguts d'arbres Mètodes més habituals per visitar els nodes d'un arbre (per fer recorreguts o cerques). Recorregut en profunditat. En preordre. En inordre. En postordre. Recorregut en amplada. Arbre buit: no fer res.

Recorreguts en profunditat: preordre 1. visitar l'arrel 2. recórrer l'arbre esquerre (en preordre) 3. recórrer l'arbre dret (en preordre) Exemple: 1, 2, 4, 5, 8, 3, 6, 9, 10 i 7.

Recorreguts en profunditat: inordre 1. recórrer l'arbre esquerre (en inordre) 2. visitar l'arrel 3. recórrer l'arbre dret (en inordre) Exemple: 4, 2, 8, 5, 1, 9, 6, 10, 3, i 7.

Recorreguts en profunditat: postordre 1. recórrer l'arbre esquerre (en postordre) 2. recórrer l'arbre dret (en postordre) 3. visitar l'arrel Exemple: 4, 8, 5, 2, 9, 10, 6, 7, 3, i 1.

Exemples Algorismes ja vistos ns ara per a arbres. Altres exemples: funcions que transformen arbres d'enters a llistes d'enters corresponents als recorreguts en preordre, inordre i postordre. Ús del mètode splice de llistes.

Exemples recorregut en profunditat: preordre list<int> preordre(arbre<int> &a) /* Pre: a = A */ /* Post: El resultat conté els nodes d'a en preordre */ { list<int> l; if (not a.es_buit()) { int node = a.arrel(); Arbre<int> a1, a2; a.fills(a1, a2); l = preordre(a1); list<int> m; m = preordre(a2); l.insert(l.begin(), node); l.splice(l.end(), m); return l; Problemes d'eciència. On?

Recorregut en preordre millorat void preordre(arbre<int> &a, list<int> & l) /* Pre: a=a, l=l */ /* Post: l conté L seguit dels nodes d'a en preordre */ { if (not a.es_buit()) { int node = a.arrel(); Arbre<int> a1, a2; a.fills(a1, a2); l.insert(l.end(), node); preordre(a1, l); preordre(a2, l);

Exemples recorregut en profunditat: inordre void inordre(arbre<int> &a, list<int> & l) /* Pre: a=a, l=l */ /* Post: l conté L seguit dels nodes d'a en inordre */ { if (not a.es_buit()) { int node=a.arrel(); Arbre<int> a1, a2; a.fills(a1, a2); inordre(a1, l); l.insert(l.end(),node); inordre(a2, l);

Exemples recorregut en profunditat: postordre void postordre(arbre<int> &a, list<int> & l) /* Pre: a=a, l=l */ /* Post: l conté L seguit dels nodes d'a en postordre */ { if (not a.es_buit()) { int node=a.arrel(); Arbre<int> a1; Arbre<int> a2; a.fills(a1, a2); postordre(a1, l); postordre(a2, l); l.insert(l.end(),node);

Recorregut en amplada Recorregut en amplada = recorregut per nivells. Nivell d'un node: distància a l'arrel (en nombre d'enllaços). Passos: arrel de l'arbre (és a dir, el node de nivell 0), tots els nodes que estan al nivell 1, d'esquerra a dreta, tots els nodes que estan a nivell 2, també d'esquerra a dreta, etc. Exemple: 1, 2, 3, 4, 5, 6, 7, 8, 9, i 10.

Recorregut en amplada: versió iterativa list<int> nivells(arbre<int> &a) /* Pre: a=a */ /* Post: El resultat conté els nodes d'a en ordre creixent respecte al nivell al qual es troben, i els de cada nivell en ordre d'esquerra a dreta */ { list<int> l; if (not a.es_buit()){ queue<arbre<int> > c; // compte: queue<arbre<int>> c no compila! int node; c.push(a); while (not c.empty()){ a = c.front(); node = a.arrel(); l.insert(l.end(), node); Arbre<int> a1, a2; a.fills(a1,a2); if (not a1.es_buit()) c.push(a1); if (not a2.es_buit()) c.push(a2); c.pop(); return l; Problema d'eciència. On?

Recorregut en amplada: versió recursiva I void nivells(arbre<int> &a, list<int> & l) /* Pre: a=a, l és buida */ /* Post: l conté els nodes d'a en ordre creixent respecte al nivell al qual es troben, i els de cada nivell en ordre d'esquerra a dreta */ { if (not a.es_buit()) { queue <Arbre<int> > c; c.push(a); nivells_rec_aux(c,l);

Recorregut en amplada: versió recursiva II void nivells_aux(queue<arbre<int> > &c, list<int> & l) /* Pre: c=c, C no conté cap arbre buit, l=l */ /* Post: l és L seguit dels nodes dels arbres de C en ordre creixent respecte al nivell al qual es troben; els nodes del mateix nivell, si són d'arbres diferents, apareixen a l'ordre al qual hi són a C, si són d'un mateix arbre apareixen en ordre d'esquerra a dreta */ { if (not c.empty()) { Arbre<int> a; a = c.front(); c.pop(); int node = a.arrel(); Arbre<int> a1, a2; a.fills(a1,a2); if (not a1.es_buit()) c.push(a1); if (not a2.es_buit()) c.push(a2); l.insert(l.end(), node); nivells_rec_aux(c, l); Post informal no del tot precisa Per què la llista amb el recurregut és un paràmetre per referència i no un retorn de funció?