You are on page 1of 8

Estructuras de Datos y Algoritmos

Prctica rboles Binarios de Bsqueda


Contenido
1. Introduccin......................................................................................................................................3
2. La estructura de datos rbol binario de bsqueda.............................................................................3
3. Extensiones del rbol binario de bsqueda......................................................................................4
3.1 Sucesor.......................................................................................................................................4
3.2 Predecesor..................................................................................................................................6
3.3 Nero de !o"as........................................................................................................................#
3.4 $ltura.........................................................................................................................................%
1. Introduccin
En esta prctica se pretenden alcanzar los siguientes objetivos:
1.- Efectuar una implementacin de la estructura de datos rbol binario de bsqueda
2.- mplementar ciertas operaciones adicionales sobre rboles binarios de bsqueda
. !a estructura de datos rbol binario de bsqueda
!omo "a #emos visto en clase$ un rbol binario de bsqueda es una estructura de datos que
verifica las siguientes condiciones:
1. Es un rbol binario
2. %ara cada nodo del rbol$ se verifica que:
todos los elementos de su subrbol izquierdo &si #a"' son menores que el nodo
todos los elementos de su subrbol derec#o &si #a"' son ma"ores que el nodo
(a manera ms apropiada de implementar un rbol binario de bsqueda es por medio de la
representacin #ijo izquierdo ) #ijo derec#o$ como se muestra en la siguiente figura:
%ara ello$ definiremos primero la clase gen*rica NodoABB<E> que nos permitir representar cada
nodo del rbol binario de bsqueda.
%osteriormente definiremos la clase gen*rica ABB<E> que implementa todas las operaciones del
rbol binario de bsqueda. Es necesario recordar que en un rbol binario de bsqueda sus
elementos deben de ser comparables. Es por ello que el parmetro gen*rico E debe implementar
la interfaz Comparable:
public class ABB<E extends Comparable<E>> {

}
Para s detalle acerca de la i&leentacin de esta estructura de datos se recoienda reitirse a
los a&untes sobre la asi'natura.
+
, !
-
. .
E
.
/
. .
0
. .

. .
". E#tensiones del rbol binario de bsqueda
1na vez dise2ado el cdigo bsico$ planteamos en la prctica una serie de problemas a resolver.
3.1 Sucesor
(a operacin de sucesor$ tal " como se vio en clase$ slo puede definirse sobre un conjunto de
elementos en el que e3iste una relacin de orden total. En concreto$ sucesor&3' puede definirse de
la siguiente manera:
45ea ! un conjunto dinmico$ !.sucesor&3' devuelve el elemento que pertenece a !
inmediatamente superior a 3.6
!omo en un rbol binario de bsqueda todos los elementos son comparables entre s7
&implementan la interfaz Comparable'$ la operacin sucesor() deber7a ser fcilmente
implementable.
+ continuacin proponemos dos estrategias para el clculo del sucesor de un elemento dado en
un rbol binario de bsqueda.
.- Estrategia 1 .-
1na estrategia simple para encontrar el elemento inmediatamente superior a uno dado en un rbol
binario de bsqueda consistir7a en obtener la secuencia ordenada de elementos8 despu*s
buscar7amos a 3 en dic#a secuencia " acceder7amos al elemento inmediatamente superior a 3$ en
la posicin contigua$ en caso de e3istir. 9a sabemos que la secuencia de elementos ordenada en
un rbol binario de bsqueda se puede obtener efectuando un recorrido en inorden$ por lo tanto el
problema quedar7a resuelto$ con los siguientes pasos:
1.- :ecorrido en inorden del abb para obtener un vector ordenado
2.- ,squeda de x en el vector ordenado
;.- +cceso al elemento inmediatamente superior a x en el vector ordenado &si e3iste'
5in embargo$ la estrategia anterior no resulta mu" eficiente$ "a que tenemos un coste &n' en el
recorrido inorden " otro coste <&n' en la bsqueda de x para obtener su sucesor. Es posible
obtener el sucesor de un elemento con una estrategia ms eficiente$ que requiere cierto anlisis
previo " que presentamos a continuacin.
.- Estrategia 2 .-
=uestro objetivo consiste en encontrar el elemento inmediatamente superior a uno dado x. <tra
manera de formular el mismo problema ser7a encontrar el elemento m7nimo de todos los
elementos ma"ores a uno dado x. %or lo tanto$ la nueva pregunta ser7a$ dado el elemento x,
>dnde se encuentra el menor de todos los elementos ma"ores a x? %ara poder responder$ es
necesario efectuar un anlisis por casos:
Caso 1$ %#% tiene subrbol derec&o
En el grfico a' se contempla el caso en el que 3 es #ijo derec#o " posee un subrbol derec#o. En
el grfico b' se contempla el caso en el que 3 es #ijo izquierdo " posee subrbol derec#o.
!omo se puede observar tanto en el grfico a' como en b'$ el sucesor de x debe encontrarse en
su subrbol derec#o$ en concreto debe ser el m7nimo de todos los elementos del subrbol
derec#o. En el grfico b' el sucesor no puede encontrarse en una rama ms a la derec#a
procedente de algn nodo padre$ "a que en ese caso el nodo padre ser7a inferior a cualquier
elemento de dic#a rama " por tanto un candidato a ser sucesor$ pero el nodo padre no puede ser
el m7nimo de los sucesores$ "a que x posee un subrbol derec#o con elementos menores al
padre$ pero ma"ores a x. 9a sabemos cmo obtener el m7nimo de un &sub'rbol binario de
bsqueda$ se trata del nodo ms a la izquierda$ por lo que el problema queda resuelto.
Por lo tanto, para resumir, cuando x posee subrbol derecho, su sucesor ser el mnimo
del subrbol derecho.
Caso $ %#% no tiene subrbol derec&o
En el grfico a' se contempla el caso en el que 3 es #ijo izquierdo " no posee un subrbol
derec#o. En el grfico b' se contempla el caso en el que 3 es #ijo derec#o " no posee subrbol
derec#o. En el grfico c' se contempla el caso en el que x no es #ijo &es ra7z'.
!omo se puede observar en el grfico a' el sucesor de x debe ser necesariamente su padre$ "a
que cualquier otro elemento en el subrbol derec#o del padre es superior al padre " por lo tanto
no puede ser un sucesor directo. 5in embargo$ tanto en el caso b' como en c' no podemos
obtener un sucesor de x "a que no posee ningn elemento a su derec#a. En estos casos$ x es el
m3imo del rbol binario de bsqueda.
5in embargo$ observemos los siguientes casos:
x
enores a(ores
a)
x
enores a(ores
b)
uc!o
a(ores
x
a)
enores

uc!o
a(ores
x
enores
x
enores
b) c)
El elemento sucesor puede aparecer en una posicin anterior$ siempre que e3ista algn ancestro
4a la derec#a6 del nodo x.
Por lo tanto, para resumir, cuando x no tiene subrbol derecho, su sucesor ser el primer
ancestro que tenga a # como descendiente a 'artir de su rama i(quierda.
%odemos resumir la estrategia en los siguientes pasos:
1.- ,uscamos el nodo x en el rbol binario de bsqueda
2.- 5i x posee subrbol derec#o devolvemos el m7nimo del subrbol derec#o
;.- 5i x no posee subrbol derec#o$ " p es el primer ancestro que tiene a x como descendiente a
partir de su rama izquierda$ entonces devolvemos p
@.- En otro caso$ x no posee sucesor$ es un elemento m3imo$ devolvemos null
!omo puede comprobarse fcilmente$ el coste de este algoritmo <&#'$ donde # es la altura del
rbol$ lo cual mejora ostensiblemente el algoritmo presentado anteriormente.
3.2 Predecesor
(a operacin de predecesor$ tal " como se vio en clase$ slo puede definirse sobre un conjunto de
elementos en el que e3iste una relacin de orden total. En concreto$ predecesor&3' puede definirse
de la siguiente manera:
45ea ! un conjunto dinmico$ !.predecesor&3' devuelve el elemento que pertenece a !
inmediatamente inferior a 3.6
!omo en un rbol binario de bsqueda todos los elementos son comparables entre s7
&implementan la interfaz Comparable'$ la operacin predecesor() deber7a ser fcilmente
implementable.
+l igual que en la operacin de sucesor&'$ para implementar la operacin de predecesor sobre un
rbol binario de bsqueda podemos escoger entre dos estrategias con distintos costes:
.- Estrategia 1 .-
enores
d)
x
enores
e)
x
Au" similar al caso anterior$ se resume en los siguientes pasos:
1.- :ecorrido en inorden del abb para obtener un vector ordenado
2.- ,squeda de x en el vector ordenado
;.- +cceso al elemento inmediatamente inferior a x en el vector ordenado &si e3iste'
:especto al coste$ los mismos comentarios que en el apartado anterior.
.- Estrategia 2 .-
:equiere un anlisis mu" similar al presentado en el apartado anterior$ " se puede resumir en los
siguientes pasos:
1.- ,uscamos el nodo x en el rbol binario de bsqueda
2.- 5i x posee subrbol izquierdo devolvemos el m3imo del subrbol izquierdo
;.- 5i x no posee subrbol izquierdo " p es el primer ancestro que tiene a x como descendiente a
partir de su rama derec#a$ entonces devolvemos p
@.- En otro caso$ x no posee predecesor$ es un elemento m7nimo$ devolvemos null
3.3 !mero de ho"as
En esta ocasin planteamos el problema de obtener el nmero de #ojas de un rbol binario de
bsqueda. 5i recordamos la definicin de #oja$
41na #oja es un nodo que no posee #ijos6.
(a estrategia a efectuar ser7a realizar un recorrido sobre el rbol " contar de alguna manera el
nmero de nodos que no poseen #ijos. 9a sabemos efectuar recorridos en preorden$ inorden "
postorden de un rbol. Escojamos por ejemplo el recorrido en preorden. 5i recordamos$ el
esquema es:
preorden&nodo'
si nodo BC null entonces
procesar&nodo'
preorden&nodo.#ijoDizquierdo'
preorden&nodo.#ijoDderec#o'
fsi
fpreorden
Este esquema nos permite procesar todos los nodos de un rbol. En nuestro caso$ procesar un
nodo significa detectar si es una #oja$ " en tal caso$ incrementar cierto contador de #ojas. 5in
embargo$ el esquema recursivo no nos permite acceder a un contador 4global6$ nicamente
trabajar con valores de retorno. Esa ser la clave de nuestra solucin: en cada llamada recursiva
obtendremos el nmero de #ojas de nuestros #ijos$ los sumaremos " devolveremos la suma. 5i la
llamada recursiva se efecta sobre un nodo sin #ijos$ entonces somos una #oja " finalizamos la
recursin$ devolviendo 1$ "a que acabamos de encontrar una #oja$ que somos nosotros.
numeroD#ojas&nodo' E
si nodo CC null devuelve F
si &so" #oja' entonces devuelve 1
#ojasDizq C numeroD#ojas&nodo.#ijoDizq'
#ojasDder C numeroD#ojas&nodo.#ijoDder'
devuelve #ojasDizq G #ojasDder
fnumeroD#ojas
3.# $ltura
%or ltimo$ planteamos el problema de obtener la altura de un rbol binario de bsqueda. 5i
recordamos$ la altura de un rbol se defin7a como la altura de su nodo ra7z$ " la altura de un nodo
se defin7a como:
4(a longitud del camino ms largo de ese nodo a una #oja del rbol6
5e trata por tanto de obtener caminos de longitud m3ima. %odemos replantear el problema al
nivel de un nico nodo: mi altura es la altura m3ima de alguno de mis #ijos ms una unidad &el
arco que me une a m7 con alguno de mis #ijos'. %or lo tanto$ para calcular la altura de un nodo$ es
necesario calcular la altura de los #ijos$ obtener el m3imo de ambas alturas e incrementar en una
unidad. + continuacin se plantea el algoritmo:
altura&nodo'
si &so" #oja' entonces devuelve F
alturaDizq C -1
alturaDder C -1
si &tengo #ijo izquierdo' alturaDizq C altura&nodo.#ijoDizq'
si &tengo #ijo derec#o' alturaDder C altura&nodo.#ijoDder'
devuelve ma3&alturaDizq$ alturaDder'
faltura

You might also like