Professional Documents
Culture Documents
}
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