You are on page 1of 4

Universidad Politcnica de Victoria

rboles Binarios de Bsqueda,


Implementacin en Java
Garca Prez Andrea Gidalti.
1330478@upv.edu.mx
ESTRUCTURAS DE DATOS.
Ingeniera en Tecnologas de la Informacin.

Como se mencion previamente, un rbol binario puede


Resumen.
En el presente trabajo se muestran los algoritmos para

ser recorrido de distintas maneras, ya sea por profundidad


o por amplitud o niveles, en ste documento se explicaran
los Recorridos por profundidad.

crear, organizar, recorrer o buscar y eliminar un nodo en


un rbol binario de bsqueda, el objetivo final, es observar
la manera en la que funciona la recursividad y comprender
los distintos tipos de Recorridos de sta clase de rboles; de
igual forma, se muestra informacin sobre los tipos de

2. Metodologa.
A continuacin se presentan los algoritmos recorridos para
la creacin y manejo de un rbol binario de bsqueda.

recorridos en profundidad que son los siguientes: Inorden,

2.1

Preorden y Postorden para que sean comprendidos

La funcin implementada para realizar la insercin se

adecuadamente.

encarga de recibir un nodo y el nodo raz para analizar el

Palabras clave: recorrido, Postorden, Inorden, Preorden,


bsqueda, rbol, hoja, raz.
1. Introduccin.

Insercin.

valor que almacena cada uno, verificar si el valor del nodo


es menor o mayor al de la raz e insertarlo en como hijo del
nodo que corresponda y hacia el lado correcto,
caracterstica de la cual se habl previamente.

Los rboles binarios son estructuras de datos en las que se

Algoritmo 1. Arbol, setNodo

emplean enlaces y nodos con una estructura en la que un

SubProceso setNodo( nodo, raiz)


Si (nodo.Valor<raiz.Valor) entonces
Si(raiz.NodoIzquierdo!=NULO) ------------------------------entonces
setNodo(nodo, -----------------------------------------------------------raiz.NodoIzquierdo)
FinSi
Si no
raiz.NodoIzquierdo(nodo)
FinSi
Si (nodo.Valor>raiz.Valor) entonces
Si(raiz.NodoDerecho!=NULO) --------------------------------entonces
setNodo(nodo, -----------------------------------------------------------raiz.NodoDerecho)
FinSi
Si no
raiz.NodoDerecho(nodo)
FinSi
FinSubProceso

nodo puede tener hasta dos nodos hijos, uno ubicado del
lado izquierdo y otro del lado derecho mismos que pueden
o no ser nulos, cada uno de estos nodos hijos puede a su
vez tener otros dos hijos, se denomina hermanos a todos
los nodos que descienden de un mismo nodo padre.
Los rboles binarios pueden ser empleados para realizar
bsquedas, est estructura tiene ciertas caractersticas,
como lo es que el hijo del lado izquierdo es menor al padre
y el hijo del lado derecho es mayor a l, en base a sta
caracterstica se define la profundidad del rbol la cual se
refiere a la cantidad de pasos que se tienen que realizar
para llegar desde la raz hasta el ltimo nodo, el ltimo hijo
y que es un factor determinante en la rapidez con la que
una bsqueda se realiza.

2.2

Bsqueda.

Esta funcin recibe el nodo raz y el dato que se buscar,


analiza por qu lado del rbol realizar la bsqueda y
manda llamar nuevamente a la funcin enviando el nodo
correspondiente (izquierdo o derecho) y el dato a buscar,
esto se realiza hasta que el dato y el valor del nodo se
encuentran, si esto nunca sucede entonces se indica que el
nodo no existe en nuestro rbol.
Algoritmo 2. Bsqueda, bsqueda.
SubProceso busqueda( nodo, dato)
Si (nodo!=NULO) entonces
Si (dato<nodo.Valor) entonces
busqueda(nodo.NodoIzquierdo, --------------------------------dato)
FinSi
Si (dato>nodo.Valor) entonces
busqueda(nodo.NodoDerecho, --------------------------------dato)
FinSi
Si (dato==nodo.Valor) entonces
Escribir 'Nodo localizado' + -------------------------------------------nodo.Valor
FinSi
Si no
Escribir 'Nodo inexistente'
FinSi
FinSubProceso

2.3

Recorridos en profundidad.

2.3.1

Recorrido InOrden.

funcin retorna un conjunto de nodos que se almacenan en


un ArrayList.
Algoritmo 4. Recorrido, postorder
SubProceso coleccion<-postorder(nodo)
Si(nodo!=NULO) Entonces
postorder(nodo.NodoIzquierdo)
postorder (nodo.NodoDerecho)
coleccion.add(nodo.Valor)
FinSi
FinSubProceso

2.3.4

Recorrido Preorder.

ste tipo de recorrido se va primeramente por la raz,


aade, despus recorre la rama o el lado izquierdo del
rbol y por ltimo recorre la rama derecha de l, la funcin
retorna un conjunto de nodos que se almacenan en un
ArrayList.
Algoritmo 5. Recorrido, prestorden
SubProceso coleccion<-postorder(nodo)
Si(nodo!=NULO) Entonces
coleccion.add(nodo.Valor)
postorder(nodo.NodoIzquierdo)
postorder (nodo.NodoDerecho)
FinSi
FinSubProceso

ste tipo de recorrido se va primeramente a recorrer la


rama o el lado izquierdo del rbol, aade,despus regresa

2.4

Eliminacin.

a la raz y por ltimo recorre la rama derecha del rbol, la


funcin retorna un conjunto de nodos que se almacenan en

En ste algoritmo tenemos tres casos posibles, el primero

un ArrayList.

de ellos es que el nodo no tenga hijos es decir que se una


terminal, por lo que solamente es necesario eliminar el

Algoritmo 3. Recorrido, inorder


SubProceso coleccion<-inorder(nodo)
Si(nodo!=NULO) Entonces
inorder(nodo.NodoIzquierdo)
coleccion.add(nodo.Valor)
inorder(nodo.NodoDerecho)
FinSi
FinSubProceso

nodo derecho o izquierdo segn sea el caso; el segundo


caso se presenta cuando el nodo que desea eliminarse tiene
solamente un hijo, lo que se hace es eliminar el nodo y
pasar el hijo inferior hacia el punto donde el nodo ha sido
eliminado, podra decirse que el nodo padre tiene un solo
hijo, el cual es eliminado, entonces el nodo nieto pasa a ser
el nuevo hijo; el ltimo caso es cuando el nodo que se
borrar tiene tanto hijo izquierdo como hijo derecho, para
lo anterior es necesario primero remplazar el nodo con su

2.3.2

Recorrido Postorder.

el de su predecesor o sucesor en inorden y eliminar el


nodo, para encontrar el predecesor en orden se ir a buscar

ste tipo de recorrido se va primeramente a recorrer la

ms hacia la derecha de su rama izquierda y el sucesor

rama o el lado izquierdo del rbol, aade, despus recorre

serpa el nodo ms a la izquierda de la rama derecha.

la rama derecha del rbol y por ltimo regresa a la raz, la

La funcin para realizar la eliminacin recibe como


padre.AsignarNodoDerecho(NULO)
FinSi
FinSi
Si no
Si(izq==1) Entonces

parmetros un nodo, el dato a eliminar, el nodo padre y


una variable de tipo entero, inicialmente se declaran dos
nodos auxiliares que se utilizaran en caso de que el nodo
que desee eliminarse tenga dos hijos, lo primero que se

padre.AsignarNodoIzquierdo(nodo.NodoIzquierdo)
FinSi
Si(izq==0) Entonces

hace es averiguar hacia donde se mover la funcin con


una serie de condicionales que envan el nodo derecho o
izquierdo segn sea el caso del valor recibido, despus de

padre.AsignarNodoDerecho(nodo.NodoIzquierdo)
FinSi
nodo<-NULO
FinSi
FinSi
Si(nodo.NodoIzquierdo==NULO)Entonces
nodo<-NULO
Si(izq==1)

realizar lo anterior se analiza, si el nodo derecho es nulo, el


nodo es igual a nulo y si izquierdo es igual a uno (por la
izquierda) el nodo izquierdo de padre toma el valor de
nulo, si no si, el izquierdo es igual a cero (por la derecha),
el nodo derecho de padre toma el valor a nulo, lo anterior
indica que el nodo no tena ningn hijo, en otro caso si no

padre.AsignarNodoIzquierdo(nodo.NodoDerecho)
FinSi
Si(izq==0)

es nulo, si izquierdo es por la izquierda el nodo izquierdo


del padre toma el valor del nodo izquierdo del nodo y si
izquierdo es por la derecha el nodo derecho del padre toma

padre.AsignarNodoDerecho(nodo.NodoDerecho)
FinSi
FinSi
Si no
aux1<-nodo.NodoDerecho
bandera=Falso
Mientras
(aux.NodoDerecho!=NULO) Hacer
aux2<-aux1
aux1<aux.NodoDerecho
bandera=Verdadero
FinMientras

el nodo derecho de nodo, se elimina el nodo; en el ltimo


de los casos el primer auxiliar toma el nodo izquierdo de
nodo, bandera inicia como falso y mientras el nodo
derecho del auxiliar sea diferente de nulo, es decir exista,
el segundo auxiliar almacenar el valor del primer auxiliar,
el primer auxiliar almacenar el valor de su nodo derecho
y la bandera se volver verdadera para indicar la entrada,
si bandera entro al mientras el segundo auxiliar en su nodo
derecho toma el valor del nodo izquierdo en el primer
auxiliar, si no, si es falsa, el nodo izquierdo de s mismo

nodo.AsignarValor(aux1.NodoIzquierdo)
Si(bandera==Verdadero)

toma el nodo izquierdo del primer auxiliar. Durante la

Entonces

funcin hay una serie de impresiones en pantalla que


ayudan a indicar en qu condiciones se encuentra.

aux2.AsignarNodoDerecho(aux1.NodoIzquierdo)
FinSi
Si no
nodo.AsignarNodoIzquierdo(aux.NodoIzquierdo)
FinSi
FinSi
FinSi

Algoritmo 6. rbol, deleteNodo


aux1<- Nuevo nodo
aux2<- Nuevo nodo
boolean bandera=falso
Si(nodo!=NULO) entonces
Si(dato<nodo.Valor) entonces
deleteNodo(nodo.NodoIzquierdo, dato, 1)
FinSi
Si(dato>nodo.Valor) entonces
deleteNodo(nodo.NodoDerecho, dato, 0)
FinSi
Si no
Si(nodo.NodoDerecho==NULO) entonces

FinSi

3.

Resultados.

Una vez que los algoritmos fueron implementados y se


verifico su funcionamiento, se ejecut el proyecto completo
para registrar la cantidad de pasos en las que se realiza la
insercin, eliminacin y bsqueda.
Pasos requeridos

Si(nodo.NodoIzquierdo==NULO) ENTONCES
nodo<-NULO
Si(izq==1) Entonces
padre.AsignarNodoIzquierdo(NULO)
FinSi
Si(izq==0) Entonces

Cantidad de Nodos

Buscar

Eliminar

Insertar

15

15

10

10

Tabla 1. Pasos para realizar un proceso


3

4.

Conclusiones.

Al haber concluido este trabajo puedo decir que el analizar


est tipo de estructura de datos ha sido enriquecedor
debido a que aplica un concepto interesante como lo es la
recursividad y de la que se habl en temas anteriores, los
distintos tipos de recorridos y en mayor parte la funcin
para eliminar un nodo han permitido un mejor
entendimiento de la pila de ejecucin que se forma con las
llamadas y de cmo estos procesos se van desapilando
para

continuar

con

otros

que

le

siguen

en

la

implementacin, puede entenderse entonces que, los


rboles binarios de bsqueda son estructuras de datos
muy eficientes ya que permiten representar ciertos datos
de una manera jerarquizada y ordenadas en base a ciertos
criterios disponibles.
5.

Referencias.

[1] http://es.wikipedia.org/wiki/%C3%81rbol_binari
o#Recorridos_en_profundidad
[2] http://es.wikipedia.org/wiki/Recorrido_de_%C3
%A1rboles
[3] http://www.juliocesar.in/2013/09/arbol-binarioy-recorridos-preorden.html
[4] https://www.youtube.com/watch?v=mTMrszfrN
tI

You might also like