Está en la página 1de 23

Implementacin de rboles binarios

(Leccin 16)

Implementacin esttica
Representacin basada en cursores a los
hijos Representacin de rboles en base a vectores
el elemento que contiene Los ndices donde se encuentran sus hijos izq y der

Cada componente del vector guarda un nodo con:


(cursores) Booleano indicando si la componente del vector est en uso o no

El rbol estar formado por el ndice donde se


encuentra la raz del rbol, y el vector que almacena los nodos
raz

rbol vaco se representar con valor 0 como ndice de la

Implementacin esttica
constante max = ... {mximo nmero de elementos almacenables} Tipo arbin : 0..max; {el 0 significa rbol vaco} nodo = registro dato:elemento; izq,der:arbin; ocupado:booleano freg; tpVectorDeNodos = vector[1..max] de nodo; variable a: arbin; vector_nodos:tpVectorDeNodos
{un mismo vector puede incluso almacenar varios rboles}

Implementacin esttica
a
1

vector_nodos

Implementacin dinmica
Encadenamiento mediante punteros de los
elementos del rbol
Cmo quedar representado el siguiente rbol?

tipos arbin = nodo; nodo = registro


dato: elemento; izq,der: arbin

freg

Especificacin de rboles binarios


espec rbolesBinarios {Recordatorio de la especificacin} usa booleanos,naturales parmetro formal gnero elemento fpf gnero arbin operaciones : arbin {rbol vaco} _<_,_>: elemento arbin arbin arbin parcial raz: arbin elemento parcial subIzq, subDer: arbin arbin vaco?: arbin bool parcial altura: arbin natural dominios de definicin iz,de:arbin; e:elemento raz(e<iz,de>) subIzq(e<iz,de>) subDer(e<iz,de>) altura(e<iz,de>) ....

{operacin plantar}

Especificacin de rboles binarios


.

ecuaciones iz,de:arbin; e:elemento raz(e<iz,de>) = e subIzq(e<iz,de>) = iz subDer(e<iz,de>) = de vaco?() = verdad vaco?(e<iz,de>) = falso (vaco?(iz))(vaco?(de)) altura(e<iz,de>) = 0 (vaco?(iz)) (vaco?(de)) altura(e<iz,de>) = suc(altura(de)) (vaco?(iz)) (vaco?(de)) altura(e<iz,de>) = suc(altura(iz)) (vaco?(iz)) (vaco?(de)) altura(e<iz,de>) = suc(max(altura(iz),altura(de))) fespec

Implementacin dinmica
mdulo rbolesBinarios importa defTipoElemento exporta tipo arbin algoritmo vaco(sal a:arbin) {Post: a=vaco} algoritmo plantar(ent e:elemento; ent ai,ad:arbin; sal a:arbin) {Post: a=plantar(e,ai,ad)} funcin raz(a:arbin) devuelve elemento {Pre: avaco} {Post: raz(a)=raz(a)} algoritmo subIzq(ent a:arbin; sal ai:arbin) {Pre: avaco} {Post: ai=Izq(a)} algoritmo subDer(ent a:arbin; sal ad:arbin) {Pre: avaco} {Post: ad=Der(a)} funcin esVaco(a:arbin) devuelve booleano {Post: esVaco(a)=esVaco(a)} funcin altura(a:arbin) devuelve natural {Pre: avaco} {Post: altura(a)=alt(a)}

Implementacin dinmica
. algoritmo asignar(sal nuevo:arbin; ent viejo:arbin) {Duplica la representacin del rbol viejo guardndolo en nuevo.} algoritmo liberar(e/s a:arbin) {Libera la memoria dinmica accesible desde a, quedando a vaco.}

implementacin tipos arbin = nodo; nodo = registro dato: elemento; izq,der: arbin freg .

Implementacin dinmica
algoritmo vaco (sal a:arbin) principio a:=nil fin algoritmo plantar (ent e:elemento; ent ai,ad:arbin; sal a:arbin) principio nuevoDato(a); a.dato:=e; a.izq:=ai; a.der:=ad fin funcin raz (a:arbin) devuelve elemento principio devuelve(a.dato) fin

Implementacin dinmica
algoritmo subIzq(ent a:arbin; sal ai:arbin) principio ai:=a.izq {No crea copia del subrbol! Devuelve un puntero al subrbol} fin algoritmo subDer(ent a:arbin; sal ad:arbin) principio ad:=a.der {No crea copia del subrbol! Devuelve un puntero al subrbol} fin funcin esVaco(a:arbin) devuelve booleano principio devuelve(a=nil) fin

Implementacin dinmica
funcin altura(a:arbin) devuelve natural funcin max(a,b:0..maxEntero) devuelve 0..maxEntero {funcin mximo de dos enteros} principio si ab entonces devuelve(a) sino devuelve(b) fsi fin principio seleccin (a.izq=nil) and (a.der=nil): devuelve(0); (a.izq=nil) and (a.dernil): devuelve(1+altura(a.der)); (a.izqnil) and (a.der=nil): devuelve(1+altura(a.izq)); (a.izqnil) and (a.dernil): devuelve(1+max(altura(a.der),altura(a.izq))) fseleccin fin

Implementacin dinmica
algoritmo asignar(sal nuevo:arbin; ent viejo:arbin) variables ai,ad:arbin principio si viejo=nil entonces nuevo:=nil sino asignar(ai,viejo.izq); asignar(ad,viejo.der); nuevoDato(nuevo); nuevo.dato:=viejo.dato; nuevo.izq:=ai; nuevo.der:=ad fsi fin

Implementacin dinmica
algoritmo liberar(e/s a:arbin) principio si anil entonces liberar(a.izq); liberar(a.der); disponer(a); a:=nil fsi fin fin {Fin del modulo rbolesBinarios}

Implementacin dinmica
Coste de las operaciones de la especificacin:
, _<_,_> (plantar), raz, subIzq, subDer, vaco? coste (1)

para que la operacin altura quede de coste (1):


tipos ptNodo = nodo; nodo = registro dato: elemento; izq, der: ptNodo freg; arbin = registro altura: 0..maxEntero; laRaz: ptNodo freg
{qu habr que hacer para mantenerla calculada?....}

tipos arbin = nodo; nodo = registro altura: 0..maxEntero; dato: elemento; izq,der: arbin freg

Implementacin dinmica - Recorridos


mdulo recorridosArbin importa rbolesBinarios,listas exporta algoritmo preOrden(ent a:arbin; e/s l:lista) {Pre: l=l0} {Post: l=l0 & preorden(a)} algoritmo inOrden(ent a:arbin; e/s l:lista) {Pre: l=l0} {Post: l=l0 & inorden(a)} algoritmo postOrden(ent a:arbin; e/s l:lista) {Pre: l=l0} {Post: l=l0 & postorden(a)} implementacin .

Implementacin dinmica - Recorridos


... algoritmo preOrden(ent a:arbin; e/s l:lista) variables ai,ad:arbin principio si not esVaco(a) entonces aadeDch(l,raz(a)); subIzq(a,ai) preOrden(ai,l); subDer(a,ad); preOrden(ad,l) fsi fin

Implementacin dinmica - Recorridos


... algoritmo inOrden (ent a:arbin; e/s l:lista) variables ai,ad: arbin principio si not esVaco(a) entonces subIzq(a,ai) inOrden(ai,l); aadeDch(l,raz(a)); subDer(a,ad); inOrden(ad,l) fsi fin

Implementacin dinmica - Recorridos


... algoritmo postOrden(ent a:arbin; e/s l:lista) variables ai,ad:arbin principio si not esVaco(a) entonces subIzq(a,ai) postOrden(ai,l); subDer(a,ad); postOrden(ad,l); aadeDch(l,raz(a)) fsi fin fin {Fin del mdulo recorridosArbin}

Cmo podramos tener versiones iterativas de los recorridos?

Implementacin: Recorrido en Anchura de rboles binarios


{ Nota: esta implementacin en vez de devolver la lista, la va a mostrar escrita en pantalla} algoritmo nivelesSub (ent a:arbin; ent i:0..maxEntero) principio {Pre: 0ialtura(a)}
si i=altura(a) entonces nivel(a,i) sino nivel(a,i); nivelesSub(a,i+1) fsi

fin algoritmo anchura(ent a:arbin) principio si a<>nil entonces nivelesSub(a,0) fsi fin

Implementacin: Recorrido en Anchura de rboles binarios


algoritmo nivel(ent a:arbin; ent i:0..maxEntero) principio {Pre: 0ialtura(a)} Implementacin si i=0 entonces escribir(raiz(a)) bastante ineficiente sino {0<ialtura(a)} Cmo podramos seleccin (a.si=nil) and (a.sdnil): nivel(a.sd, i-1); tener una versin iterativa? (a.sinil) and (a.sd=nil): nivel(a.si, i-1); (a.sinil) and (a.sdnil): si altura(a.si)>=i-1 entonces nivel(a.si,i-1) fsi; si altura(a.sd)>=i-1 entonces nivel(a.sd,i-1) fsi fseleccin fsi fin Nota:
No est implementado utilizando la implementacin vista de rbolesBinarios

Implementacin: Recorrido en Anchura de rboles binarios


Implementacin algoritmo nivel(ent a:arbin; ent i:0..maxEntero) bastante ineficiente principio {Pre: 0ialtura(a)} Cmo podramos si i=0 entonces escribir(raiz(a)) tener una versin sino {0<ialtura(a)} iterativa? seleccin esVacio(SubIzq(a)) and not esVacio(SubDer(a)): nivel(SubDer(a), i-1); not esVacio(SubIzq(a)) and esVacio(SubDer(a)): nivel(SubIzq(a), i-1); not esVacio(SubIzq(a)) and not esVacio(SubDer(a)): si altura(SubIzq(a))>=i-1 entonces nivel(SubIzq(a),i-1) fsi; si altura(SubDer(a))>=i-1 entonces nivel(SubDer(a),i-1) fsi fseleccin fsi fin
Nota: Ahora si est implementado utilizando la implementacin vista de rbolesBinarios importa rbolesBinarios

Versiones iterativas de los recorridos?

También podría gustarte