You are on page 1of 7

RBOLES BINARIOS

INTRODUCCIN

En ciencias de la computacin, un rbol binario es una estructura de datos en


la cual cada nodo puede tener un hijo izquierdo y un hijo derecho. No pueden
tener ms de dos hijos (de ah el nombre "binario"). Si algn hijo tiene como
referencia a null, es decir que no almacena ningn dato, entonces este es
llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno.
Usos comunes de los rboles binarios son los rboles binarios de bsqueda,
los montculos binarios y Codificacin de Huffman

Para qu 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.


RBOLES:

Definiciones:

Un rbol es una coleccin de nodos (del tipo que se


quiera), uno de los cuales se llama raz junto con una
relacin de paternidad que impone una estructura
jerrquica sobre los nodos.
Una manera natural de definirlo es de forma recursiva:
- Caso base: o el rbol esta vaco o tiene un
solo nodo.
- Caso general: un nodo raz ( r ) y cero o
ms subrboles A1, A2,..., An cada uno de
ellos tiene su raz conectada a r mediante
una arista.

Ejemplo (ndice de un libro):


libro

C1 C2 C3

1.1 1.2 2.1 2.2

2.1.1 2.1.2

Libro seria el nodo raz (r).


Cada subrbol tendra raz C1, C2, C3.
El subrbol con raz C2 tendra como subrboles 2.1 y
2.2.

Partes de un rbol:
Raz: el nodo inicial o base de una estructura
en rbol.
Nodo hoja: el nodo de un rbol que no tiene
hijos.
Dos nodos son hermanos si tienen el mismo
padre.
Un camino de un nodo N1 a otro Nk se define
como la secuencia de nodos N1, N2,..., Nk tal
que Ni es el padre de Ni+1 para 1 <= i < k.
La longitud de este camino es el nmero de
aristas que lo forman, k -1.
Existe un camino de longitud cero entre c ada
nodo y l mismo. En un rbol hay exactamente
un camino entre la raz y cada nodo.
Un nodo es antecesor de un segundo si se
encuentra en el camino de la raz a este.
Un nodo es descendiente de un segundo si se
encuentra en el camino de este a algn nodo
hoja.
La profundidad de un nodo es la longitud del
camino nico entre la raz y este.
La altura de un nodo es el camino ms largo del
nodo a una hoja. La altura de un rbol es la
altura de la raz.

Ejemplo:
A

B C D

E F G

H I

Raz: A
Hojas: E, H, I, G, D.
B es padre de E, F.
F es hijo de B y hermano de E.
Camino de B a I, BFI.
Longitud 2.
Profundidad de F 2 y altura 1.
Recorridos sobre rboles binarios

Recorridos en profundidad
El mtodo de este recorrido es tratar de encontrar de la cabecera a la raz en nodo de
unidad binaria. Ahora pasamos a ver la implementacin de los distintos recorridos:

Recorrido en preorden

En este tipo de recorrido se realiza cierta accin (quizs simplemente imprimir por pantalla
el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subrbol
izquierdo y cuando se haya concluido, el subrbol derecho. Otra forma para entender el
recorrido con este mtodo seria seguir el orden: nodo raz, nodo izquierda, nodo derecha.

En el rbol de la figura el recorrido en preorden sera: 2, 7, 2, 6, 5, 11, 5, 9 y 4.

void preorden(tArbol *a)


{
if (a != NULL) {
tratar(a); //Realiza una operacin en
nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}

Implementacin en pseudocdigo de forma iterativa:

push(s,NULL); //insertamos en una pila (stack) el valor NULL,


para asegurarnos de que est vaca
push(s,raz); //insertamos el nodo raz
MIENTRAS (s <> NULL) HACER
p = pop(s); //sacamos un elemento de la
pila
tratar(p); //realizamos operaciones sobre
el nodo p
SI (D(p) <> NULL) //preguntamos si p tiene rbol
derecho
ENTONCES push(s,D(p));
FIN-SI
SI (I(p) <> NULL) //preguntamos si p tiene rbol
izquierdo
ENTONCES push(s,I(p));
FIN-SI
FIN-MIENTRAS

Recorrido en postorden

En este caso se trata primero el subrbol izquierdo, despus el derecho y por ltimo el
nodo actual. Otra forma para entender el recorrido con este mtodo seria seguir el orden:
nodo izquierda, nodo derecha, nodo raz. En el rbol de la figura el recorrido en postorden
sera: 2, 5, 11, 6, 7, 4, 9, 5 y 2.

void postorden(tArbol *a)


{
if (a != NULL) {
postorden(a->hIzquiedo);
postorden(a->hDerecho);
tratar(a); //Realiza una operacin en
nodo
}
}

Recorrido en inorden

En este caso se trata primero el subrbol izquierdo, despus el nodo actual y por ltimo el
subrbol derecho. En un ABB este recorrido dara los valores de clave ordenados de menor
a mayor. Otra forma para entender el recorrido con este mtodo seria seguir el orden: nodo
izquierda, nodo raz, nodo derecha. En el rbol de la figura el recorrido en inorden sera: 2,
7, 5, 6, 11, 2, 5, 4, 9.

Esquema de implementacin:

void inorden(tArbol *a)


{
if (a != NULL) {
inorden(a->hIzquierdo);
tratar(a); //Realiza una
operacin en nodo
inorden(a->hDerecho);
}
}

Recorridos en amplitud (o por niveles)


En este caso el recorrido se realiza en orden por los distintos niveles del rbol. As, se
comenzara tratando el nivel 1, que solo contiene el nodo raz, seguidamente el nivel 2, el
3 y as sucesivamente. En el rbol de la figura el recorrido en amplitud sera: 2, 7, 5, 2, 6,
9, 5, 11 y 4.

Al contrario que en los mtodos de recorrido en profundidad, el recorrido por niveles no es


de naturaleza recursiva. Por ello, se debe utilizar una cola para recordar los subrboles
izquierdos y derecho de cada nodo.

El esquema algoritmo para implementar un recorrido por niveles es exactamente el mismo


que el utilizado en la versin iterativa del recorrido en preorden pero cambiando la
estructura de datos que almacena los nodos por una cola.

Implementacin en C:

void arbol_recorrido_anch (tipo_Arbol* A) {


tipo_Cola cola_nodos; // esta cola esta implementada previamente,
almacena punteros (posiciones de nodos de rbol)

tipo_Pos nodo_actual; // este es un puntero llevara el recorrido

if (vacio(A)) // si el rbol esta vacio, salimos


return;

cola_inicializa(&cola_nodos); // obvio, y necesario

cola_enqueue(A, &cola_nodos); // se encola la raz

while (!vacia(&cola_nodos)) { // mientras la cola no se vacie se


realizara el recorrido
nodo_actual = cola_dequeue(&cola_nodos) // de la cola saldran
los nodos ordenados por nivel

printf("%c,", nodo_actual->info); // se "procesa" el nodo


donde va el recorrido, en este caso se imprime

if (nodo_actual->izq != null) // si existe, ponemos el hijo


izquierdo en la cola
cola_enqueue(nodo_actual->izq, &cola_nodos);

if (nodo_actual->der != null) // si existe, ponemos el hijo


derecho en la cola
cola_enqueue(nodo_actual->der, &cola_nodos);
} // al vaciarse la cola se han visitado todos los nodos del
rbol
}

Mtodos para almacenar rboles Binarios


Los rboles binarios pueden ser construidos a partir de lenguajes de programacin de
varias formas. En un lenguaje con registros y referencias, los rboles binarios son
construidos tpicamente con una estructura de nodos y punteros en la cual se almacenan
datos, cada uno de estos nodos tiene una referencia o puntero a un nodo izquierdo y a un
nodo derecho denominados hijos. En ocasiones, tambin contiene un puntero a un nico
nodo. Si un nodo tiene menos de dos hijos, algunos de los punteros de los hijos pueden
ser definidos como nulos para indicar que no dispone de dicho nodo. En la figura adjunta
se puede observar la estructura de dicha implementacin.

Los rboles binarios tambin pueden ser almacenados como una estructura de datos
implcita en vectores, y si el rbol es un rbol binario completo, este mtodo no
desaprovecha el espacio en memoria. Tomaremos como notacin la siguiente: si un nodo
tiene un ndice i, sus hijos se encuentran en ndices 2i + 1 y 2i + 2, mientras que sus

padres (si los tiene) se encuentra en el ndice (partiendo de que la raz tenga
ndice cero). Este mtodo tiene como ventajas el tener almacenados los datos de forma
ms compacta y por tener una forma ms rpida y eficiente de localizar los datos en
particular durante un preoden transversal. Sin embargo, desperdicia mucho espacio en
memoria.

You might also like