You are on page 1of 9

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

Introduccin
Vamos a hablar primero un poco de que son los arboles binarios; nos
dice Wikipedia Un rbol binario es un grafo conexo, acclico y no
dirigido tal que el grado de cada vrtice no es mayor a 3, eso signifca
que tenemos un grafo donde cada nodo puede tener mximo 2 hijos
( o hojas ) y estas hojas no pueden tener como hijos a cualquier otra
hoja anterior como podemos ver en la siguiente imagen:

Podemos ver en la imagen como Raz es padre de Hoja 1 y Hoja


2 y estas a su vez tambin son la raz de las Sub hojas y se vuelve
un proceso recursivo hasta ncantidad de hojas.

Para que sirve un rbol binario?

Como todos sabemos un rbol binario es una estructura de datos, y


como todas, este sirve para organizar datos para facilitar su
manipulacin, ya sea el ingreso, borrado o bsqueda de datos, y
precisamente una de las principales ventajas de los rboles binarios
es la bsqueda, ya que como en muchos algoritmos de bsqueda
necesitamos tener la informacin ordenada y en nuestros rboles
binarios precisamente los datos van ingresando de forma ordenada.

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

Recorridos con los conocidos mtodos recursivos:

Inorden

Postorden

Preorden

Cmo se ingresa la informacin?


Como dije anteriormente, la informacin se ingresa de forma ordenada
esto se resuelve de forma muy sencilla con estos pasos:
1.

Se toma el dato a ingresar X

2.

Partiendo de la raz preguntamos: Nodo == null ( o no


existe ) ?

3.

En caso afirmativo X pasa a ocupar el lugar del nodo y


ya hemos ingresado nuestro primer dato.

4.

En caso negativo preguntamos: X < Nodo

5.

En caso de ser menor pasamos al Nodo de la IZQUIERDA


del que acabamos de preguntar y repetimos desde el paso
2 partiendo del Nodo al que acabamos de visitar

6.

En caso de ser mayor pasamos al Nodo de la DERECHA y


tal cual hicimos con el caso anterior repetimos desde el
paso 2 partiendo de este nuevo Nodo.

Nos daremos cuenta de que es un proceso RECURSIVO en el


cual al final por ms grande que sea el rbol el dato a entrar
ocupar un lugar, vamos a ejemplificar lo ya mencionado con
una imagen:

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

Si observan con detenimiento la imagen aunque se vea algo


complejo entendern bien el funcionamiento.

Vamos a programarlo
Todo lo dicho anteriormente, vamos a programarlo ahora usando POO
con java (para que sea ms fcil de entender).
Comenzamos con la abstraccin de la informacin, tenemos que un
rbol binario est compuesto por la raz y sus nodos hijos, de la misma
forma que la misma raz no es ms que otro nodo, partiendo de esto
entonces crearemos 2 clases:
(Quiero comentar antes de esto que, aunque no soy muy
partidario de escribir los nombres de los mtodos y clases en
espaol, por cuestiones de entendimiento para muchas
personas que lleguen a esta informacin, los pondr de esa
forma).

ALEJANDRO ARCHUNDIA GALEAZZI

Arbol

Nodo

ES1421001992

Para comenzar con esas clases tenemos, vamos ahora a defnirlas:

1 public class Nodo {


2
3
/* Declaraciones de variables */
4
private int valor;
5
6
private Nodo padre;
7
private Nodo hojaIzquierda;
8
private Nodo hojaDerecha;
9
1
/* Constructor */
0
public Nodo(int valor) {
1
this.valor = valor;
1
}
1
2
/* Setters y Getters */
1
public void setValor(int valor) {
3
this.valor = valor;
1
}
4
1
public int getValor() {
5
return valor;
1
}
6
1
public Nodo getPadre() {
7
return padre;
1
}
8
1
public void setPadre(Nodo padre) {
9
this.padre = padre;
2
}
0
2
public Nodo getHojaIzquierda() {
1
return hojaIzquierda;
2
}
2
2
public void setHojaIzquierda(Nodo hojaIzquierda) {
3
this.hojaIzquierda = hojaIzquierda;
2
}
4
2
public Nodo getHojaDerecha() {
5
return hojaDerecha;
2
}
6
2
public void setHojaDerecha(Nodo hojaDerecha) {
7
this.hojaDerecha = hojaDerecha;
2
}
8
2 }
9
3

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
4
6
4
7
4
8

Vamos a revisar un poco ms de cerca el cdigo.


Es una clase muy sencilla, como podemos ver nicamente tiene 4
atributos (variables) fciles de entender:

valor

hojaIzquierda

hojaDerecha

valor es el dato almacenado del propio nodo, mientras que como


recordaremos cada nodo puede tener mximo 2 hijos uno a la
izquierda y otro a la derecha, donde todos los nodos a su izquierda
son menores a el mismo y todos los nodos a su derecha son mayores

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

a el mismo, pero que comienzan como nulos ya que al crear un nuevo


nodo, este no tiene hijos.
Hay que tener cuidado con setValor( int valor ) Porque? pues bien, no
podemos actualizar el valor al aire ya que perderamos el orden, por lo
que tenemos un contructor:
1
2
3
4

/* Constructor */
public Nodo(int valor) {
this.valor = valor;
}

a partir del cual se ingresa el valor del nodo al crear una instancia del
mismo:

1 Nodo nodo = new Nodo( 1 );

Ya tenemos nuestra clase nodo lista, ahora pasemos con la clase


Arbol.java que es an ms sencilla ( en defnicin ) que Nodo:

1 public class Arbol {


2
3
/* Atributos */
4
private Nodo raiz;
5
6
/* Contructories */
7
public Arbol( int valor ) {
8
this.raiz = new Nodo( valor );
9
}
1
0
public Arbol( Nodo raiz ) {
1
this.raiz = raiz;
1
}
1
2
/* Setters y Getters */
1
public Nodo getRaiz() {
3
return raiz;
1
}
4
1
public void setRaiz(Nodo raiz) {
5
this.raiz = raiz;
1
}
6
1 }

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

7
1
8
1
9
2
0
2
1
2
2
2
3
2
4

Prcticamente por ahora lo importante es su atributo raiz del tipo


Nodo, el cual representar a todo nuestro rbol, adicionalmente he
creado constructores que pueden ser de ayuda al momento de
inicializar el rbol para crear la raz de paso.
pffff que nos hemos alargado con el post, pero an no terminamos,
acabamos apenas de defnir entidades faltan todas las funciones del
mismo. vamos con ellas.
Hay que agregar mtodos a nuestra clase de Arbol para poder
ingresar nuevos nodos:

addNodo

removeNodo

recorridoPreorden

recorridoInorden

recorridoPostorden
Programando las funciones del rbol
En esta primera parte quiero abarcar al menos hasta el ingreso de
nuevos nodos, comencemos entonces.

ALEJANDRO ARCHUNDIA GALEAZZI

ES1421001992

La modifcacin la haremos en nuestra clase Arbol que es la que


llevar estas funciones de control, recordemos nuestro algoritmo
de insercin que planteamos anteriormente:
1.
2.
3.

Se toma el dato a ingresar X


Partiendo de la raz preguntamos: Nodo == null ( o no existe ) ?
En caso afirmativo X pasa a ocupar el lugar del nodo y ya hemos
ingresado nuestro primer dato.
4. En caso negativo preguntamos: X < Nodo
5. En caso de ser menor pasamos al Nodo de la IZQUIERDA del que
acabamos de preguntar y repetimos desde el paso 2 partiendo del
Nodo al que acabamos de visitar
6. En caso de ser mayor pasamos al Nodo de la DERECHA y tal cual
hicimos con el caso anterior repetimos desde el paso 2 partiendo de
este nuevo Nodo.

Entonces defnamos nuestra funcin:


Insercin de nodos en un rbol binario
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9

private void private void addNodo( Nodo nodo, Nodo raiz ) {


/* 2.- Partiendo de la raz preguntamos: Nodo == null ( o no existe ) ? */
if ( raiz == null ) {
/*
* 3.- En caso afirmativo X pasa a ocupar el lugar del nodo y ya
* hemos ingresado nuestro primer dato.
* ==== EDITO =====
* Muchas gracias a @Espectro por la correccin de esta lnea
*/
this.setRaiz(nodo);
}
else {
/* 4.- En caso negativo preguntamos: X < Nodo */
if ( nodo.getValor() <= raiz.getValor() ) {
/*
* 5.- En caso de ser menor pasamos al Nodo de la IZQUIERDA del
* que acabamos de preguntar y repetimos desde el paso 2
* partiendo del Nodo al que acabamos de visitar
*/
if (raiz.getHojaIzquierda() == null) {
raiz.setHojaIzquierda(nodo);
}
else {
addNodo( nodo , raiz.getHojaIzquierda() );
}
}
else {
/*
* 6.- En caso de ser mayor pasamos al Nodo de la DERECHA y tal

ALEJANDRO ARCHUNDIA GALEAZZI


2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5

ES1421001992

* cual hicimos con el caso anterior repetimos desde el paso 2


* partiendo de este nuevo Nodo.
*/
if (raiz.getHojaDerecha() == null) {
raiz.setHojaDerecha(nodo);
}
else {
addNodo( nodo, raiz.getHojaDerecha() );
}
}

}
public void addNodo( Nodo nodo ) {
this.addNodo( nodo , this.raiz );
}

You might also like