Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Introducción
El árbol es una estructura de datos muy importante en informática y en ciencias de
computación. Los árboles son estructuras no lineales, al contrario que los arrays y las
listas enlazadas, que constituyen estructuras lineales. Los árboles se utilizan para
representar fórmulas algebraicas, para organizar objetos en orden de tal forma que las
búsquedas sean muy eficientes y en aplicaciones diversas tales como inteligencia artificial
o algoritmos de cifrado. Casi todos los sistemas operativos almacenan sus archivos en
árboles o estructuras similares a árboles. Además de las aplicaciones citadas, los árboles se
utilizan en diseño de compiladores, procesado de texto y algoritmos de búsqueda.
2. Árboles generales y terminología
Intuitivamente, el concepto de árbol implica una estructura en la que los datos se organizan
de modo que los elementos de información están relacionados entre sí a través de ramas. El
árbol genealógico es el ejemplo típico más representativo del concepto de árbol general. La
Figura 1 representa un ejemplo de árbol general, gráficamente puede verse como un árbol
invertido, con la raíz en la parte más alta, de la que salen ramas que llegan a las hojas, que
están en la parte baja.
1
La Figura 2 muestra un árbol.
Figura 2: Árbol
3. Terminología
Para comprender mejor que es un árbol comenzaremos explicando cómo está estructurado.
Nodos: Se le llama Nodo a cada elemento que contiene un Árbol.
Nodo Raíz: Se refiere al primer nodo de un Árbol, Solo un nodo del Árbol puede ser la
Raíz.
Nodo Padre: Se utiliza este término para llamar a todos aquellos nodos que tiene al menos
un hijo.
Nodo Hijo: Los hijos son todos aquellos nodos que tiene un padre.
Nodo Hermano: Los nodos hermanos son aquellos nodos que comparte a un mismo padre
en común dentro de la estructura.
Nodo Hoja: Son todos aquellos nodos que no tienen hijos, los cuales siempre se encuentran
en los extremos de la estructura.
Nodo Rama: Estos son todos aquellos nodos que no son la raíz y que además tiene al
menos un hijo.
2
Figura 3: La imagen muestra de forma gráfica cuales son los nodos Raíz, Rama, Hoja.
Figura 4: La siguiente imagen muestra de forma gráfica los nodos Padre, Hijo y Hermanos
Los arboles además de los nodos tiene otras propiedades importantes que son utilizadas en
diferentes ámbitos los cuales son:
Nivel: Nos referimos como nivel a cada generación dentro del árbol.
Por ejemplo, cuando a un nodo hoja le agregamos un hijo, el nodo hoja pasa a ser un nodo rama,
pero además el árbol crece una generación por lo que el Árbol tiene un nivel más. Cada
generación tiene un número de Nivel distinto que las demás generaciones.
3
Altura: Le llamamos Altura al número máximo de niveles de un Árbol.
La altura es calculada mediante recursividad tomando el nivel más grande de los dos sub-árboles
de forma recursiva de la siguiente manera:
Peso: Conocemos como peso al número de nodos que tiene un Árbol. Este factor es importante
porque nos da una idea del tamaño del árbol y el tamaño en memoria que nos puede ocupar en
tiempo de ejecución (Complejidad Espacial en análisis de algoritmos.)
Figura 6:La imagen nos muestra cómo se calcula el peso de un Árbol, el cual es la suma de todos sus nodos, sin importar
el orden en que sean contados.
4
El peso se puede calcular mediante cualquier tipo de recorrido el cual se va contando los nodos a
medida que avanza sobre la estructura. El peso es un árbol es igual a la suma del peso de los sub-
árboles hijos + 1
Orden: El Orden de un árbol es el número máximo de hijos que puede tener un Nodo.
Figura 7:Imagen que nuestra dos Árboles con Orden = 2(Izquierda) y un segundo con Orden = 3(Derecha).
Notemos que un Árbol con Orden = 1 no tendría sentido ya que sería una estructura lineal ya que
cada nodo solo podría tener un Hijo y tendríamos un Árbol como la Imagen de la Fig.8.
Grado: El grado se refiere al número mayor de hijos que tiene alguno de los nodos del Árbol y está
limitado por el Orden, ya que este indica el número máximo de hijos que puede tener un nodo.
5
Figura 9:En la imagen podemos apreciar un Árbol con grado 2(Izquierda) y un otro con grado 3(Derecha).
El grado se calcula contando de forma recursiva el número de hijos de cada sub-árbol hijo y el
número de hijos del nodo actual para tomar el mayor, esta operación se hace de forma recursiva
para recorrer todo el árbol.
Sub-Árbol: Conocemos como Sub-Árbol a todo Árbol generado a partir de una sección
determinada del Árbol, Por lo que podemos decir que un Árbol es un nodo Raíz con N Sub-
Árboles.
Figura 10:En la imagen de puede apreciar que un Árbol está compuesto por una seria de Sub-Arboles los cual conforman
toda la estructura.
Existen escenarios donde podemos sacar un Sub-Árboles del Árbol para procesarlo de forma
separada, de esta forma el Sub-Árboles pasa a ser un Árbol independiente, También podemos
eliminar Sub-Árboles completos, Agregarlos, entre otras operaciones.
6
4. Tipos de árboles
4.1. Árbol n-ario
Los arboles n-arios son aquellos arboles donde el número máximo de hijos por nodo es de N, en la
figura 9 podemos apreciar dos árboles con grado 2 y grado 3, estos dos árboles también los
podemos definir como Árbol n-ario con n = 2 y n=3 respectivamente.
Esta estructura se caracteriza por que cada nodo solo puede tener máximo 2 hijo, dicho de otra
manera, es un Árbol n-ario de Grado 2.
4.3. Árbol binario lleno: Es aquel en la que el nodo tiene cero o 2 hijos con excepción de la
Raíz.
Figura 12:Podemos apreciar que el árbol de la derecha no está lleno ya que uno de sus nodos no cumple con la condición
cero o 2 hijos. ya que el nodo C solo tiene un hijo.
4.4. Árbol binario perfecto: Es un Árbol lleno en donde todos las Hojas están en el mismo
Nivel.
7
En la imagen podemos apreciar que el árbol de la izquierda tiene todas sus hojas al mismo nivel y
que además está lleno, lo que lo convierte en un árbol binario perfecto. Sin embargo, del lado
derecho podemos ver que, aunque el árbol está lleno no tiene todas las hojas al mismo nivel lo
que hace que no sea un árbol binario perfecto, pero si lleno.
Los recorridos son algoritmos que nos permiten recorrer un árbol en un orden especifico, los
recorridos nos pueden ayudar encontrar un nodo en el árbol, o buscar una posición determinada
para insertar o eliminar un nodo.
Básicamente podemos catalogar las búsquedas en dos tipos, las búsquedas en profundidad y las
búsquedas en amplitud.
6. Búsquedas no informadas
Las búsquedas no informadas son aquellas en que se realiza el viaje por todo el árbol sin tener una
pista de donde pueda estar el dato deseado. Este tipo de búsquedas también se conocen como
búsquedas a ciegas.
Para comprender mejor que es una búsqueda no informada expondremos el siguiente ejemplo:
Imagine que vamos por la carretera y de repente encontramos dos caminos, el problema aquí es
que uno después de 50 kilómetros está en construcción y el otro nos lleva a nuestro destino, sin
embargo, ninguno de los caminos tiene señalamiento. Lo que tendríamos que hacer es recorrer el
primero camino y después de 50 kilómetros encontrarnos con que el camino está en construcción,
entonces tendríamos que regresar para irnos por el segundo camino, el cual nos lleva a nuestro
destino (Para esto ya recorrimos los 50 kilómetros de ida y los 50 kilómetros de regreso lo que nos
da 100 kilómetros más a nuestra ruta).
A este tipo de escenarios en los cuales las búsquedas de hacen a ciegas los conocemos como
búsquedas no informadas.
8
6.1.Búsqueda en profundidad
Recorrido Pre-orden: El recorrido inicia en la Raíz y luego se recorre en pre-orden cada
uno de los sub-árboles de izquierda a derecha.
Esta definición puede ser un poco compleja de entender por lo que mejor les dejo la siguiente
imagen.
Figura 13:En la imagen podemos ver el orden en que es recorrido el árbol iniciando desde la Raíz.
9
Recorrido in-orden: Se recorre en in-orden el primer sub-árbol, luego se recorre la raíz y al
final se recorre en in-orden los demás sub-árboles.
Se recorre primero la raíz, luego se recorren los demás nodos ordenados por el nivel al que
pertenecen en orden de Izquierda a derecha.
Este tipo de búsqueda se caracteriza por que la búsqueda se hace nivel por nivel y de izquierda a
derecha.
Figura 14:En la imagen se observa cómo es que un nodo es buscado mediante la búsqueda en profundidad.
10
En la imagen podemos observar que el árbol es recorrido en su totalidad, pero esto no siempre es
así, ya que el algoritmo se detiene cuando el elemento buscado es encontrado.
7. Árbol de expresiones
Una aplicación muy importante de los árboles binarios son los árboles de expresiones. Una
expresión es una secuencia de tokens (componentes de léxicos que siguen unas reglas
establecidas). Un token puede ser un operando o bien un operador.
Si se supone que todos los operadores tienen dos operandos, se puede representar una expresión
mediante un árbol binario cuya raíz contiene un operador y cuyos subárboles izquierdo y derecho
son los operandos izquierdo y derecho, respectivamente. Cada operando puede ser una letra (x,
y,a, b etc.) o una subexpresión representada como un subárbol. La Figura 16 muestra un árbol
cuya raíz es el operador *, su subárbol izquierdo representa la subexpresión (x + y) y su subárbol
derecho representa la subexpresión (a - b). El nodo raíz del subárbol izquierdo contiene el
operador (+) de la subexpresión izquierda y el nodo raíz del subárbol derecho contiene el operador
(-) de la subexpresión derecha. Todos los operandos letras se almacenan en nodos hojas.
11
Figura 16:Árbol de expresión (x + y)*(a - b)
a) X * Y /(-Z)
b) A + B * (-(C + D))
c) A * (X + Y) * C
Ejemplo 2: Dibujar la representación en árbol binario de cada una de las
siguientes expresiones:
12
a) Y * X /(A + B)* C
b) X * Y /A + B * C
8. Reglas para la construcción de árboles de expresiones
Los árboles de expresiones se utilizan en las computadoras para evaluar expresiones
usadas en programas. El algoritmo más sencillo para construir un árbol de expresión
es aquel que lee una expresión completa que contiene paréntesis. Una expresión con
paréntesis es aquella en que:
1. La prioridad se determina sólo por paréntesis.
2. La expresión completa se sitúa entre paréntesis.
A fin de ver la prioridad en las expresiones, considérese la expresión
a * c + e / g - (b + d)
Los operadores con prioridad más alta son * y /, es decir:
(a * c) + (e / g) - (b + d)
Los operadores que siguen en orden de prioridad son + y -, que se evalúan de
izquierda a derecha. Por consiguiente, se puede escribir:
((a * c) + (e / g)) - (b + d)
Por último, la expresión completa entre paréntesis será:
(((a * c) + (e / g)) - (b + d))
El algoritmo para la construcción de un árbol de expresión puede expresarse en los
siguientes pasos:
1. La primera vez que se encuentre un paréntesis a izquierda “(“, crear un nodo
que será el nodo raíz. Se llama a éste nodo actual y se sitúa en una pila.
2. Cada vez que se encuentre un nuevo paréntesis a izquierda “(”, crear un nuevo
nodo. Si el nodo actual no tiene un hijo izquierdo, hacer el nuevo nodo el hijo
izquierdo; en caso contrario, hacerlo el hijo derecho. Hacer el nuevo nodo el nodo
actual y ponerlo en la pila.
3. Cuando se encuentre un operando, crear un nuevo nodo y asignar el operando a
su campo de datos. Si el nodo actual no tiene un hijo izquierdo, hacer el nuevo
nodo el hijo izquierdo; en caso contrario, hacerlo el hijo derecho.
4. Cuando se encuentre un operador, sacar el nodo cabeza de la pila y situar el
operador en el campo dato del nodo.
5. Ignorar el paréntesis derecho y los blancos.
Ejercicios:
1. Dado los siguientes árboles, determinar los recorridos Pre-orden, In-orden y Post-
orden
a) c * d + e
(c*d)+e
Pre–orden:raíz-izq-der: +*cde
In-orden:izq-raíz-der: c*d+e
Post-orden:izq-der-raíz: cd*e+
13
b) [((a + b) * c/d) + e ^ f]/g
Pre–orden:raíz-izq-der:/+*+ab/cd^efg
In-orden:izq-raíz-der:a+b*c/d+e^f/g
Post-orden:izq-der-raíz:ab+cd/*ef^+g/
c) Árbol
Pre–orden:raíz-izq-der:MEBADLPNVTZ
In-orden:izq-raíz-der:ABDELMNPTVZ
Post-orden:izq-der-raíz:ADBLENTZVPM
14
a) Dibujar el árbol binario.
b) Dar el recorrido en post-orden.
15
El siguiente número es 20, mayor que 8, lo que implica debe ir a la derecha de 8.
Cada nuevo elemento se inserta como una hoja del árbol. Los restantes elementos se
pueden situar fácilmente.
Una propiedad de los árboles binarios de búsqueda es que no son únicos para los
mismos datos.
Ejemplo: Construir un árbol binario de búsqueda que corresponda a un recorrido en
orden cuyos elementos son: 1, 3, 4, 5, 6, 7, 8, 9 y 10
16
Empezamos a recorrer el árbol por la raíz, que es con el primer nodo con el que
comparamos. Seguiríamos los siguientes pasos:
Comparamos el valor buscado (24) con el del nodo raíz (18), como el valor buscado
es mayor, de existir en el árbol, estaría a la derecha.
Nos movemos al hijo derecho del nodo raíz. Comparamos el valor buscado (24) con
el valor del nodo (25), como el primero es menor, de existir en el árbol, estaría en el
subárbol izquierdo.
Nos movemos al hijo izquierdo de 25, que es 23.
Comparamos el valor buscado (24) con el valor del nodo (23). Como el primero es
mayor, de existir, estaría a la derecha.
Nos movemos al hijo derecho de 23, que es 24. Hemos llegado al nodo buscado.
Empezamos a recorrer el árbol por la raíz, que es con el primer nodo con el que
comparamos. Seguiríamos los siguientes pasos:
Comparamos el valor buscado (24) con el del nodo raíz (18), como el valor buscado
es mayor, de existir en el árbol, estaría a la derecha.
Nos movemos al hijo derecho del nodo raíz. Comparamos el valor buscado (24) con
el valor del nodo (25), como el primero es menor, de existir en el árbol, estaría en el
subárbol izquierdo.
Nos movemos al hijo izquierdo de 25, que es 23.
Comparamos el valor buscado (24) con el valor del nodo (23). Como el primero es
mayor, de existir, estaría a la derecha.
Nos movemos al hijo derecho de 23, que es 24. Hemos llegado al nodo buscado.
9.3. Inserción de un nodo
Supongamos que queremos insertar el nodo de valor 30 en nuestro árbol. Lo
primero que hay que hacer es recorrer el árbol buscando el nodo que se quiere
insertar, siguiendo el proceso de búsqueda ya explicado en los dos pasos anteriores.
Si encontramos el nodo con el valor que queremos insertar, daríamos un mensaje de
error diciendo que el nodo ya existe, puesto que no se admiten duplicados.
Por el contrario, si en el proceso de búsqueda llegamos a un hueco, insertamos el
nodo en dicho hueco.
El proceso de inserción para un nodo que no existe, por ejemplo, el nodo 30, se
muestra en la imagen siguiente, marcando en rojo el camino seguido.
17
9.4. Eliminación de un nodo hoja
Habíamos dicho que el proceso de eliminación de un nodo era el más complicado y
que adoptábamos estrategias distintas dependiendo de los hijos que tuviera el nodo a
eliminar.
El caso más sencillo es cuando el nodo no tiene ningún hijo, es decir, cuando es un
nodo hoja.
18
Empezamos localizando el nodo a eliminar, en este caso, aquel con el valor 12.
Comparamos con el nodo raíz, como 12 es menor que 18, nos movemos al nodo
hijo izquierdo.
El hijo izquierdo tiene el valor 9, que es menor que 12, luego nos movemos al hijo
derecho de este, y en ese nodo ya encontramos el nodo que buscábamos.
El nodo con valor 12, tiene un único hijo, el izquierdo, con el valor 11..
Hacemos que el puntero que apuntaba al nodo a eliminar, puntero ubicado en el
padre del nodo a eliminar, apunte al hijo de este. Es decir, el nodo con valor 9 pasa
a tener un hijo derecho con valor 11.
Ahora ya podemos borrar el nodo 12.
9.6. Eliminación de un nodo con dos hijos, promocionando un valor del
subárbol izquierdo
Habíamos visto que cuando queremos eliminar un nodo que tiene dos hijos,
tenemos dos posibilidades para rellenar el hueco que este nodo deja: Podemos tomar
el nodo de su subárbol izquierdo que tenga un valor mayor, o el nodo de su subárbol
derecho que tenga un valor menor.
Queremos eliminar nada más ni nada menos que el nodo raíz, con valor 18.
El nodo raíz tiene dos subárboles, el de la izquierda con nodo raíz con valor
9, y el de la derecha con nodo raíz de valor 25.
19
Al eliminar el nodo de valor 18, tendremos que reemplazarlo por otro nodo
del árbol, que pasaría a ocupar la posición de este en la estructura. En esta
ocasión, vamos a buscar dicho nodo en el subárbol izquierdo.
Como buscamos el nodo en el subárbol izquierdo, tenemos que buscar el
nodo de mayor valor, que por como construimos el árbol, coincidirá con el
nodo que este más a la derecha. En nuestro caso, el nodo de valor 12.
Substituimos el nodo de valor 18 por el de valor 12.
Eliminamos el nodo inicial de valor 12 que previamente hemos copiado en
el nodo de valor 18. El nodo inicial con valor 12 no puede tener dos hijos, ya
que si tuviera un hijo a la derecha, no sería el nodo mayor del subárbol
izquierdo. Así es que este nodo podrá tener un hijo o ninguno. La
eliminación de un nodo en ambos casos, la he explicado en los pasos 6 y 5
respectivamente.
Tras realizar estas operaciones, nos queda el siguiente árbol binario:
20
Buscamos en el subárbol derecho, el nodo que contenga el menor valor, que
coincidirá con aquel que este más a la izquierda en el subárbol derecho. Este
nodo es el nodo con valor 21.
Substituimos el nodo de valor 18 por el de valor 21.
Eliminamos el nodo inicial de valor 21 que previamente hemos copiado en
el nodo de valor 18.
Tras realizar estas operaciones, nos queda el siguiente árbol binario:
21