Anda di halaman 1dari 28

rboles N-arios

(Lecciones 15 y 17)

Conceptos, definiciones y terminologa bsica


rbol:
Conjunto de elementos de un mismo tipo,
denominados nodos, que pueden representarse en un grafo no orientado, conexo y acclico, en el que existe un vrtice destacado denominado raz
Por lo general es una estructura jerrquica

Definicin recursiva:
Un rbol n-ario (con n1) es un conjunto no vaco de
elementos del mismo tipo tal que: Existe un elemento destacado llamado raz del rbol el resto de los elementos se distribuyen en m subconjuntos
disjuntos (0 m n ), llamados subrboles del rbol original, cada uno de los cuales es a su vez un rbol n-ario

Conceptos, definiciones y terminologa bsica


rbol ordenado:
Si en el conjunto de subrboles de un rbol n-ario se supone definida una relacin de orden total, el rbol se denomina ordenado

rbol ordenado con raz X y subrboles A1 Am Leyenda: Nodo rbol

rbol 3-ario de nmeros enteros

Conceptos, definiciones y terminologa bsica


Bosque:
Un bosque ordenado de grado n (con n1) es una
secuencia A1, Am, con 0 m n , de rboles n-arios ordenados. Si m=0, el bosque se llama vaco

Un rbol n-ario se genera a partir de un elemento y un


bosque ordenado de grado n, bastando considerar el elemento como raz del rbol, y el bosque como subrboles

Los bosques se generarn como secuencias de rboles, a


partir de un bosque vaco, y una operacin de aadir por la derecha un rbol a un bosque

Especificacin Algebraica
espec rbolesOrdenados usa booleanos,naturales parmetro formal gnero elmto fpf gneros bosque, rbol operaciones [ ]: > bosque +dch: bosque rbol > bosque

Generadoras de bosque (cnj. libre)

long: bosque > nat parcial _[_]: bosque nat > rbol parcial resto: bosque > bosque {=el bosque menos el 1er rbol} plantar: elmto bosque > rbol .
Generadora de rbol (cnj. libre)

Especificacin Algebraica
raz: rbol > elmto bosq: rbol > bosque parcial subrbol: rbol nat > rbol numHijos: rbol > nat hoja?: rbol > bool altBosque: bosque > nat altrbol: rbol > nat dominios de definicin b:bosque; i:nat; e:elmto; a:rbol b[i] est definido slo si (1i)(ilong(b)) resto(+dch(b,a)) subrbol(plantar(e,b),i) def. slo si (1i)(ilong(b))

..

Especificacin Algebraica
ecuaciones b:bosque; a:rbol; i:nat; e:elmto long([ ]) = 0 long(+dch(b,a)) = suc(long(b)) i=suc(long(b)) > +dch(b,a)[i] = a isuc(long(b)) > +dch(b,a)[i] = b[i] resto(+dch([ ],a)) = [ ] resto(+dch(+dch(b,a1),a2)) = +dch(resto(+dch(b,a1)),a2) ..

Especificacin Algebraica
raz(plantar(e,b)) = e bosq(plantar(e,b)) = b subrbol(plantar(e,b),i) = b[i] numHijos(plantar(e,b)) = long(b) hoja?(a) = (numHijos(a) = 0) altBosque([ ]) = 0 altBosque(+dch(b,a)) = max(altBosque(b),altrbol(a)) hoja?(a) > altrbol(a) = 0 not hoja?(a) > altrbol(a) = suc(altBosque(bosq(a))) fespec

Recorridos en rboles n-arios


Un recorrido de un rbol consiste en visitar todos los Raz 1 elementos del rbol una sola vez. Recorridos en profundidad: Recorrido en pre-orden: 2 An N+1 A1 1. se visita la raz 2. se recorren en pre-orden todos los subrboles, deN+1
izquierda a derecha
Raz

1. se recorren en post-orden todos los subrboles, de


izquierda a derecha 2. se visita la raz

Recorrido en post-orden:

1
A1

An

El recorrido en anchura de un rbol consiste en visitar todos los elementos del rbol una sola vez, de la forma:
primero se visitan los elementos del nivel 0, luego los del nivel 1, y as sucesivamente, En cada nivel, se visitan los elementos de izquierda a derecha

Especificacin Algebraica - Recorridos


espec recorridosrbolesOrdenados usa rbolesOrdenados,listas {de elementos} operaciones
preBosque, postBosque: bosque lista preorden, postorden: rbol lista
1 2
A1 Raz

N+1

An

N+1

Raz

ecuaciones b:bosque; a:rbol; e:elemento

1
An

A1 preBosque([ ]) = [ ] preBosque(+dch(b,a)) = preBosque(b) & preorden(a) preorden(plantar(e,b)) = +izq(e,preBosque(b)) postBosque([ ]) = [ ] postBosque(+dch(b,a) = postBosque(b) & postorden(a) postorden(plantar(e,b)) = +dch(postBosque(b),e)

fespec
Nota: [ ] bosque vaco +dch operacin para arboles [] lista de elementos vaca +dch, +izq operaciones de listas

Implementacin Dinmica
Representacin Primognito - sig. Hermano

Implementacin Primognito - sig. Hermano


modulo rbolesOrdenados importa defTipoElemento Exporta tipos rbol,bosque {Aqu se utiliza la letra cursiva para referirse a las operaciones especificadas algebraicamente} algoritmo creaVaco(sal b:bosque) {Post: b=[]} algoritmo aadeDch(e/s b:bosque; ent a:rbol) {Pre: b=b0} {Post: b=+dch(b0,a)} funcin long(b:bosque) devuelve 0..maxEntero {Post: long(b)=long(b)} algoritmo observa(ent b:bosque; ent i:1..maxEntero; sal a:rbol) {Pre: (1i)(ilong(b))} {Post: a=b[i]} funcin altBosque(b:bosque) devuelve 0..maxEntero {Post: altBosque(b)=altBosque(b)} ..

Implementacin Primognito - sig. Hermano


algoritmo resto(ent b:bosque; sal rb:bosque) {Pre: b[]} {Post: rb=resto(b)} algoritmo plantar(ent e:elemento; ent b:bosque; sal a:rbol) {Post: a=plantar(e,b)} funcin raz(a:rbol) devuelve elemento {Post: raz(a)=raz(a)} algoritmo bosq(ent a:rbol; sal b:bosque) {Post: b=bosq(a)} algoritmo subrbol(ent a:rbol; ent i:1..maxEntero; sal sa:rbol) {Pre: (a=plantar(e,b))(1i)(ilong(b))} {Post: sa=subrbol(a,i)} funcin numHijos(a:rbol) devuelve 0..maxEntero {Post: numHijos(a)=numHijos(a)} funcin esHoja(a:rbol) devuelve booleano {Post: esHoja(a)=hoja?(a)} funcin altrbol(a:rbol) devuelve 0..maxEntero {Post: altrbol(a)=altrbol(a)}

Implementacin Primognito - sig. Hermano

algoritmo asignaBosque(sal nuevo:bosque; ent viejo:bosque)


{Duplica la representacin del bosque viejo guardndolo en nuevo.}

algoritmo liberaBosque(e/s b:bosque)


{Libera la memoria dinmica accesible desde b, quedando b vaco.}

algoritmo asignarbol(sal nuevo:rbol; ent viejo:rbol)


{Duplica la representacin del rbol viejo guardndolo en nuevo.}

algoritmo liberarbol(e/s a:rbol)


{Libera la memoria dinmica accesible desde a.}

Implementacin Tipos rbol = nodo; nodo = registro dato:elemento; primognito,sigHermano:rbol freg; bosque = rbol

Implementacin Primognito - sig. Hermano

algoritmo creaVaco(sal b:bosque) principio b:=nil Fin algoritmo aadeDch(e/s b:bosque; ent a:rbol) variable aux:bosque principio si b=nil entonces b:=a sino aux:=b; mientrasQue aux.sigHermanonil hacer aux:=aux.sigHermano fmq; aux.sigHermano:=a fsi fin
.

Implementacin Primognito - sig. Hermano


funcin long(b:bosque) devuelve 0..maxEntero principio si b=nil entonces devuelve(0) sino devuelve(1+long(b.sigHermano)) fsi fin algoritmo observa(ent b:bosque; ent i:1..maxEntero;sal a:rbol) principio si i=1 entonces a:=b sino observa(b.sigHermano,i-1,a) fsi Fin .

Implementacin Primognito - sig. Hermano


funcin altBosque(b:bosque) devuelve 0..maxEntero principio si b=nil entonces devuelve(0) sino devuelve(max(altrbol(b),altBosque(b.sigHermano))) fsi Fin algoritmo resto(ent b:bosque; sal rb:bosque) principio rb:=b.sigHermano fin .

Implementacin Primognito - sig. Hermano


algoritmo plantar(ent e:elemento; ent b:bosque;sal a:rbol) principio nuevoDato(a); a.dato:=e; a.primognito:=b; a.sigHermano:=nil fin funcin raz(a:rbol) devuelve elemento principio devuelve(a.dato) Fin .

Implementacin Primognito - sig. Hermano


.

algoritmo bosq(ent a:rbol; sal b:bosque) principio b:=a.primognito fin algoritmo subrbol(ent a:rbol; ent i:1..maxEntero; sal sa:rbol) variable b:bosque principio
bosq(a,b); observa(b,i,sa)

Fin funcin numHijos(a:rbol) devuelve 0..maxEntero variable b:bosque principio bosq(a,b); devuelve(long(b)) Fin .

Implementacin Primognito - sig. Hermano


algoritmo esHoja(valor a:rbol) devuelve booleano principio devuelve(a.primognito=nil) Fin funcin altrbol(a:rbol) devuelve 0..maxEntero variable b:bosque principio si esHoja(a) entonces devuelve(0) sino bosq(a,b); devuelve(1+altBosque(b)) fsi fin

Implementacin Primognito - sig. Hermano


algoritmo asignaBosque(sal nuevo:bosque; ent viejo:bosque) variable primerrbol:rbol principio si viejo=nil entonces nuevo:=nil sino observa(viejo,1,primerrbol); asignarbol(nuevo,primerrbol); asignaBosque(nuevo.sigHermano,viejo.sigHermano) fsi Fin algoritmo liberaBosque(e/s b:bosque) principio si bnil entonces liberaBosque(b.sigHermano); liberarbol(b) fsi fin

Implementacin Primognito - sig. Hermano


algoritmo asignarbol (sal nuevo:rbol; ent viejo:rbol) variables viejoBosq,nuevoBosq:bosque principio bosq(viejo,viejoBosq); asignaBosque(nuevoBosq,viejoBosq); plantar(raz(viejo),nuevoBosq,nuevo) Fin algoritmo liberarbol(e/s a:rbol) principio liberaBosque(a.primognito); disponer(a) Fin Fin {Fin del modulo rbolesOrdenados}

Implementacin Primognito - sig. Hermano


Coste en tiempo de las operaciones: creaVaco, resto, plantar, raiz, bosq y esHoja (1)
Modificando la representacin, puede lograrse que
las operaciones aadeDch, long, altBosque, numHijos y altArbol tengan tambin coste (1)

Implementacin Primognito - sig. Hermano


mdulo recorridosrboles importa rbolesOrdenados,listas exporta Algoritmo preOrden(ent a:rbol; sal l:lista) {Pre: l=l0} {Post: l=l0 & preorden(a)} algoritmo postOrden(ent a:rbol; sal l:lista) {Pre: l=l0} {Post: l=l0 & postorden(a)} implementacin

Implementacin Primognito - sig. Hermano


algoritmo preBosque(ent b:bosque; sal l:lista) variable primerrbol:rbol; rb:bosque principio si long(b)0 entonces observa(b,1,primerrbol); preOrden(primerrbol,l); resto(b,rb); preBosque(rb,l) fsi Fin algoritmo preOrden(ent a:rbol; sal l:lista) variable b:bosque principio aadeDch(l,raz(a)); bosq(a,b); preBosque(b,l) fin

Implementacin Primognito - sig. Hermano

algoritmo postBosque(ent b:bosque; sal l:lista) variable primerrbol:rbol; rb:bosque principio si long(b)0 entonces observa(b,1,primerrbol); postOrden(primerrbol,l); resto(b,rb); postBosque(rb,l) fsi Fin algoritmo postOrden(ent a:rbol; sal l:lista) variable b:bosque principio bosq(a,b); postBosque(b,l); aadeDch(l,raz(a)) Fin Fin {fin del modulo}

Definiciones
Un rbol n-ario se dice homogneo si todos sus
subrboles excepto las hojas tienen n hijos. Un rbol es completo cuando todas sus hojas tienen la misma profundidad Un rbol se dice casi-completo cuando se puede obtener a partir de un rbol completo eliminando hojas consecutivas del ltimo nivel, comenzando por la que est ms a la derecha

Otras implementaciones
Implementacin esttica (ver leccin 17):