Está en la página 1de 5

�rbol binario

Ir a la navegaci�nIr a la b�squeda
Commons-emblem-question book orange.svg
Este art�culo o secci�n necesita referencias que aparezcan en una publicaci�n
acreditada.
Este aviso fue puesto el 2 de noviembre de 2011.
En ciencias de la computaci�n, 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 m�s
de dos hijos (de ah� el nombre "binario"). Si alg�n hijo tiene como referencia a
null, es decir que no almacena ning�n 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 b�squeda, los mont�culos binarios
y Codificaci�n de Huffman.

�ndice
1 Definici�n de teor�a de grafos
2 Tipos de �rboles binarios
3 Implementaci�n en C
4 Recorridos sobre �rboles binarios
4.1 Recorridos en profundidad
4.1.1 Recorrido en preorden
4.1.2 Recorrido en postorden
4.1.3 Recorrido en inorden
4.2 Recorridos en amplitud (o por niveles)
4.3 Creaci�n de �rboles a partir de los recorridos
5 M�todos para almacenar �rboles Binarios
6 Codificaci�n de �rboles n-arios como �rboles binarios
7 V�ase tambi�n
8 Enlaces externos
Definici�n de teor�a de grafos

Un �rbol binario sencillo de tama�o 9, 3 niveles (nivel 0 hasta nivel 3) y altura 3


(altura = m�ximo nivel), con un nodo ra�z cuyo valor es 2.
En teor�a de grafos, se usa la siguiente definici�n: �Un �rbol binario es un grafo
conexo, ac�clico y no dirigido tal que el grado de cada v�rtice no es mayor a 3�.
De esta forma solo existe un camino entre un par de nodos.

Un �rbol binario con enraizado es como un grafo que tiene uno de sus v�rtices,
llamado ra�z, de grado no mayor a 2. Con la ra�z escogida, cada v�rtice tendr� un
�nico padre, y nunca m�s de dos hijos. Si rehusamos el requerimiento de la
conectividad, permitiendo m�ltiples componentes conectados en el grafo, llamaremos
a esta �ltima estructura un bosque'.

Tipos de �rboles binarios


Un �rbol binario es un �rbol en el que ning�n nodo puede tener m�s de dos
sub�rboles. En un �rbol binario cada nodo puede tener cero, uno o dos hijos
(sub�rboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de la
derecha como hijo derecho.

Existen tipos de �rboles binarios que suelen usarse para fines espec�ficos, como:

�rbol binario de b�squeda


�rbol de Fibonacci
Implementaci�n en C
Un �rbol binario puede declararse de varias maneras. Algunas de ellas son:

Estructura con manejo de memoria din�mica, siendo el puntero que apunta al �rbol de
tipo tArbol:
typedef struct nodo {
int clave;
struct nodo *izdo, *dcho;
}Nodo;
Estructura con arreglo indexado:

typedef struct tArbol


{
int clave;
tArbol hIzquierdo, hDerecho;
} tArbol;
tArbol �rbol[NUMERO_DE_NODOS];
En el caso de un �rbol binario casi-completo (o un �rbol completo), puede
utilizarse un sencillo arreglo de enteros con tantas posiciones como nodos deba
tener el �rbol. La informaci�n de la ubicaci�n del nodo en el �rbol es impl�cita a
cada posici�n del arreglo. As�, si un nodo est� en la posici�n i, sus hijos se
encuentran en las posiciones 2i+1 y 2i+2, mientras que su padre (si tiene), se
encuentra en la posici�n truncamiento((i-1)/2) (suponiendo que la ra�z est� en la
posici�n cero). Este m�todo se beneficia de un almacenamiento m�s compacto y una
mejor localidad de referencia, particularmente durante un recorrido en preorden. La
estructura para este caso ser�a por tanto:

int �rbol[NUMERO_DE_NODOS];
Recorridos sobre �rboles binarios
Recorridos en profundidad
El m�todo de este recorrido es tratar de encontrar de la cabecera a la ra�z en nodo
de unidad binaria. Ahora pasamos a ver la implementaci�n de los distintos
recorridos:

Recorrido en preorden
En este tipo de recorrido se realiza cierta acci�n (quiz�s simplemente imprimir por
pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se
trata el sub�rbol izquierdo y cuando se haya concluido, el sub�rbol derecho. Otra
forma para entender el recorrido con este m�todo seria seguir el orden: nodo ra�z,
nodo izquierda, nodo derecha.

En el �rbol de la figura el recorrido en preorden ser�a: 2, 7, 2, 6, 5, 11, 5, 9 y


4.

void preorden(tArbol *a)


{
if (a != NULL) {
tratar(a); //Realiza una operaci�n en nodo
preorden(a->hIzquierdo);
preorden(a->hDerecho);
}
}
Implementaci�n en pseudoc�digo de forma iterativa:

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


asegurarnos de que est� vac�a
push(s,ra�z); //insertamos el nodo ra�z
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 sub�rbol izquierdo, despu�s el derecho y por
�ltimo el nodo actual. Otra forma para entender el recorrido con este m�todo seria
seguir el orden: nodo izquierda, nodo derecha, nodo ra�z. En el �rbol de la figura
el recorrido en postorden ser�a: 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 operaci�n en nodo
}
}
Recorrido en inorden
En este caso se trata primero el sub�rbol izquierdo, despu�s el nodo actual y por
�ltimo el sub�rbol derecho. En un ABB este recorrido dar�a los valores de clave
ordenados de menor a mayor. Otra forma para entender el recorrido con este m�todo
seria seguir el orden: nodo izquierda, nodo ra�z, nodo derecha. En el �rbol de la
figura el recorrido en inorden ser�a: 2, 7, 5, 6, 11, 2, 5, 4, 9.

Esquema de implementaci�n:

void inorden(tArbol *a)


{
if (a != NULL) {
inorden(a->hIzquierdo);
tratar(a); //Realiza una operaci�n 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 comenzar�a tratando el nivel 1, que solo contiene el nodo ra�z,
seguidamente el nivel 2, el 3 y as� sucesivamente. En el �rbol de la figura el
recorrido en amplitud ser�a: 2, 7, 5, 2, 6, 9, 5, 11 y 4.

Al contrario que en los m�todos de recorrido en profundidad, el recorrido por


niveles no es de naturaleza recursiva. Por ello, se debe utilizar una cola para
recordar los sub�rboles izquierdos y derecho de cada nodo.

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


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

Implementaci�n 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 ra�z

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


}
Creaci�n de �rboles a partir de los recorridos
Para poder dibujar un �rbol binario sobre la base de los recorridos, se necesitan
por lo menos dos de los recorridos de profundidad (en caso de que no se repitan los
nodos, ya que si se repiten los nodos es recomendable tener los tres recorridos),
ya sean inorden y preorden o inorden y postorden, la �nica diferencia entre usar el
recorrido en preorden o postorden es que en preorden se usa el primer nodo para
encontrar la ra�z y en postorden se usa el �ltimo nodo.

El m�todo consiste en ir dividiendo los recorridos del �rbol en peque�os


sub�rboles, se va encontrando la ra�z con el preorden o postorden y se divide en
dos sub�rboles bas�ndonos en el recorrido en inorden. En el caso de que los nodos
se repitan es conveniente tener los 3 recorridos para identificar m�s f�cilmente
cu�l de los nodos es la ra�z actual.

Para el �rbol de la figura corresponden los siguientes recorridos:

Preorden {\displaystyle 2,7,2,6,5,11,5,9,4} 2,7,2,6,5,11,5,9,4

Inorden {\displaystyle 2,7,5,6,11,2,5,4,9} 2,7,5,6,11,2,5,4,9

Postorden {\displaystyle 2,5,11,6,7,4,9,5,2} 2,5,11,6,7,4,9,5,2

Para encontrar la ra�z es necesario tener el recorrido preorden o postorden, ya que


la ra�z es el primer nodo o el �ltimo nodo respectivamente. En este caso la ra�z es
el {\displaystyle 2} 2.

Una vez encontrada la ra�z, es necesario saber su posici�n en el recorrido inorden,


del paso anterior se tiene el nodo {\displaystyle 2} 2, pero existen 2 nodos con
ese valor, el primero y el de en medio. Si el primer dos es la ra�z, entonces no
existe ninguna rama del lado izquierdo, en ese caso la siguiente ra�z de acuerdo
con el recorrido en postorden es {\displaystyle 5} 5 y de acuerdo con preorden es
{\displaystyle 7} 7, lo cual es una incongruencia, de esa forma sabemos que el otro
{\displaystyle 2} 2 es la ra�z.
Entonces marcamos la ra�z en el recorrido inorden:

Preorden {\displaystyle {\underline {2}},7,2,6,5,11,5,9,4} \underline


{2},7,2,6,5,11,5,9,4

Inorden {\displaystyle 2,7,5,6,11,{\underline {2}},5,4,9} 2,7,5,6,11,\underline


{2},5,4,9

Postorden {\displaystyle 2,5,11,6,7,4,9,5,{\underline {2}}}


2,5,11,6,7,4,9,5,\underline {2}

El recorrido inorden, es un recorrido de los �rboles binarios en los que se empieza


desde el nodo que se encuentra m�s a la izquierda de todos, sigue con la ra�z y
termina con los nodos del lado derecho, entonces, como en el recorrido inorden ya
encontramos la ra�z, la parte izquierda representa el sub�rbol izquierdo y la parte
derecha representa el sub�rbol derecho.

En los recorridos tenemos 5 nodos a la izquierda del {\displaystyle 2} 2 y a la


derecha se encuentran 3 valores, entonces podemos crear los recorridos para el
sub�rbol izquierdo y el sub�rbol derecho

Sub�rbol izquierdo Sub�rbol derecho


Preorden {\displaystyle 7,2,6,5,11} 7,2,6,5,11 Preorden {\displaystyle 5,9,4}
5,9,4
Inorden {\displaystyle 2,7,5,6,11} 2,7,5,6,11 Inorden {\displaystyle 5,4,9} 5,4,9
Postorden {\displaystyle 2,5,11,6,7} 2,5,11,6,7 Postorden {\displaystyle 4,9,5}
4,9,5

Se sigue repitiendo el proceso hasta encontrar todos los nodos del �rbol, en este
punto la siguiente ra�z izquierda es el {\displaystyle 7} 7 y la ra�z derecha el
{\displaystyle 5} 5.

Cuando se llegan a nodos en los que �nicamente cuentan con una rama es necesario
saber que rama es la derecha y cu�l es la izquierda (para algunos �rboles con
balanceo como los AVL), por ejemplo siguiendo la rama de la derecha partiendo de
que el {\displaystyle 5} 5 es la ra�z el recorrido inorden es {\displaystyle 5,4,9}
5,4,9 entonces el siguiente nodo va a la derecha, no hay nodo a la izquierda,
despu�s, los recorridos para el sub�rbol son:

Preorden {\displaystyle 9,4} 9,4

Inorden {\displaystyle 4,9} 4,9

Postorden {\displaystyle 4,9} 4,9

Finalmente el siguiente nodo se coloca a la izquierda del {\displaystyle 9} 9.

Este m�todo es 100% efectivo cuando no existen nodos repetidos, cuando los nodos se
repiten la complejidad aumenta para poder descubrir cu�l es el nodo ra�z en el
recorrido inorden

También podría gustarte