Hasta ahora se han estudiado estructuras lineales (estáticas o dinámicas) donde un
elemento le sigue a otro. Los árboles representan estructuras no lineales y dinámicas.
Se dice dinámica puesto que la estructura del árbol puede variar durante la ejecución
del programa. No lineales porque a cada elemento del árbol puede seguirle varios
elementos.
Generalidades
Un árbol es una estructura jerárquica aplicada sobre una colección de elementos u
objetos llamados nodos; uno del os cuales se denomina raíz.
Formalmente se define un árbol de tipo T, como una estructura homogénea que es la
concatenación de un elemento de tipo T junto con un número finito de árboles
disjuntos llamados subárboles. Una forma particular de árbol puede ser la estructura
vacía.
Aplicaciones
Se le utiliza para representar :
• Fórmulas matemáticas
• Registrar la historia de un campeonato
• Construir un árbol genealógico
• Análisis de circuitos eléctricos
• Numerar los capítulos y secciones de un libro.
Representación
a) Diagramas de Venn
b) Anidación de paréntesis
(A((B( C ))D))
c) Por notación decimal
1.A, 1.1.B, 1.1.1.C, 1.2D
d) Notación indentada
e) Grafos
Características y Propiedades de los Árboles
a) Todo árbol que no es vacío, tiene un único nodo raíz
b) Sí un nodo X es descendiente de un nodo Y, decimos que X es hijo de Y
c) Sí un nodo X es antecesor directo de un nodo Y, decimos que X es padre de Y
d) Todos los nodos de un mismo padre, son hermanos
e) Todo nodo que no tiene hijos es un nodo terminal
f) Todo nodo que no es raíz, ni terminal, es un nodo interior
g) Grado es el número de descendientes directos de un determinado nodo. Grado de
un árbol es el máximo grado de todos los nodos de un árbol.
h) Nivel es el número de nodos que deben ser recorridos para llegar a un
determinado nodo (desde el raíz)
i) Altura del árbol es el máximo número de niveles de entre todos las ramas del árbol
más 1.
Raíz =
Hermanos =
Terminales =
Interiores =
Grado =
Grado del árbol =
Nivel = Altura =
ÁRBOLES BINARIOS
Un árbol de grado 2, es un árbol donde cada nodo puede tener como máximo 2
subárboles, siendo necesario distinguir entre el subárbol derecho y el subárbol
izquierdo. Los árboles binarios tienen múltiples aplicaciones:
• Representa la historia de un campeonato donde hay un ganador, 2 finalistas 4
semifinalistas.
• Representa expresiones algebraicas construidas con operadores binarios.
Árboles Binarios: Distintos, Similares y Equivalentes
Son distintos cuando sus estructuras son diferentes
Son similares cuando sus estructuras son idénticas, pero la información que
contienen sus nodos difieren entre sí.
Son equivalentes cuando son similares y además los nodos contienen la misma
información.
Árboles Binarios Completos
Aquellos en el que todos sus nodos excepto los terminales tiene 2 hijos.
Número de nodos = 2h – 1
=
Número de Nodos por nivel = 2h-1
=
Conversión de un Árbol General en Árbol Binario
Los árboles binarios es la estructura de datos fundamental en la teoría de árboles.
Por lo que estableceremos los mecanismos para convertir un árbol general en un
árbol binario, ya que los árboles binarios son más fáciles de programar que los
árboles generales
Pasos de Conversión
1. Deben enlazarse los hijos de cada nodo en forma horizontal (los hermanos)
2. Debe enlazarse en forma vertical el nodo padre con el hijo que se encuentra
más a la izquierda. Además debe eliminarse el vínculo de ese padre con el
resto de sus hijos.
3. Rotar el diagrama resultante, aproximadamente 45 grados hacia la izquierda
obteniéndose el árbol binario correspondiente.
Ejemplo:
Resultados:
Conversión de un Bosque como Árbol Binario
Pasos de Conversión
1. Deben enlazarse en forma horizontal las raíces de los distintos árboles
generales
2. Enlazar los hijos de cada nodo en forma horizontal (los hermanos)
3. Debe enlazarse en forma vertical el nodo padre con el hijo que se encuentre
más a la izquierda. Además debe eliminarse el vínculo de ese padre con el
resto de sus hijos.
4. Debe rotarse el diagrama resultante 45 grados hacía la izquierda y se obtendrá
el árbol binario correspondiente.
Ejemplo:
REPRESENTACION DE LOS ÁRBOLES BINARIOS
Existen 2 formas tradicionales de representar un árbol binario en memoria.
1. Por medio de datos tipo puntero (variables dinámicas)
2. Con arreglos o listas enlazadas
Cada nodo tiene la siguiente estructura:
IZQ INFO DER
Representación Enlazada de Árboles Binarios
B C
D E F
G
Recorridos en Árboles Binarios
Recorrer significa visitar los nodos del árbol en forma sistemática, de tal
manera que todos los nodos del mismo sean visitados una sola vez
Existen 3 formas diferentes de efectuar un recorrido:
1. PREORDEN
a. Visitar raíz
b. Recorrer subárbol izquierdo
c. Recorrer subárbol derecho
2. INORDEN
a. Recorrer subárbol izquierdo
b. Visitar raíz
c. Recorrer subárbol derecho
3. POSTORDEN
a. Recorrer subárbol izquierdo
b. Recorrer subárbol derecho
c. Visitar raíz
§ El recorrido preorden se obtiene viajando hacia abajo por la rama más a la
izquierda, hasta que se encuentre el nodo terminal, entonces se vuelve
hacia atrás hasta la siguiente rama y así sucesivamente, en este recorrido
el nodo terminal más a la derecha se inspecciona último.
§ En el recorrido postorden cada descendiente de un nodo N es procesado
antes que el nodo N.
§ Los nodos terminales siempre se recorren en el mismo orden de izquierda a
derecha (en todos los recorridos).
Ejemplo
a) Preorden
b) Inorden
c) Postorden
Ejercicio:
a) Preorden
b) Inorden
c) Postorden
Algoritmo de Recorrido PreOrden
(Empleando Pilas)
Suponga un árbol binario T representado por arrays lineales enlazados INFO, IZQ,
DER. Emplear array PILA para mantener temporalmente las direcciones de los nodos.
PTR = puntero del árbol; SUP = puntero de la PILA
1) Inicio
2) SUP≠ 1, PILA[SUP] ≠ 0, PTR≠ RAIZ
3) MIENTRAS PTR<>0
Escribir INFO[PTR]
SI DER[PTR]<>0
ENTONCES
SUP≠ SUP+1; PILA[SUP] ≠ DER[PTR]
FIN_si
SI IZQ[PTR]<>0
ENTONCES PTR ≠ IZQ[PTR]
SINO PTR ≠ PILA[SUP]; SUP≠ SUP-1
FIN_si
FIN_mientras
4) FIN
ABDGHKCEF
Algoritmo de Recorrido InOrden
(Empleando Pilas)
1) Inicio
2) SUP≠ 1, PILA[SUP] ≠ 0, PTR≠ RAIZ
3) MIENTRAS PTR<>0 hacer
SUP≠ SUP+1; PILA[SUP] ≠ PTR
PTR≠ IZQ[PTR]
FIN_mientras
4) PTR≠ PILA[SUP]; SUP≠ SUP-1
5) MIENTRAS PTR<>0 hacer
Escribir INFO[PTR]
SI DER[PTR]<>0
ENTONCES PTR≠ DER[PTR]; Ir al paso(3)
FIN_si
PTR≠ PILA[SUP]; SUP≠ SUP-1
FIN_mientras
6) Fin
GDHKBAECF
Algoritmo de Recorrido PostOrden
(empleando Pilas)
1) Inicio
2) SUP≠ 1, PILA[SUP] ≠ 0, PTR≠ RAIZ
3) MIENTRAS PTR<>0 hacer
SUP≠ SUP+1; PILA[SUP] ≠ PTR
SI DER[PTR]<>0
ENTONCES
SUP≠ SUP+1; PILA[SUP] ≠ -DER[PTR]
FIN_si
PTR≠ IZQ[PTR]
FIN_mientras
4) PTR≠ PILA[SUP]; SUP≠ SUP-1
5) MIENTRAS PTR>0 hacer
Escribir INFO[PTR]
PTR≠ PILA[SUP]; SUP≠ SUP-1
FIN_mientras
6) SI PTR<0
ENTONCES PTR≠ -PTR; Ir al paso (3)
FiN_si
7) Fin
Es una estructura sobre la cual se pueden realizar eficientemente las operaciones de
búsqueda, inserción y eliminación. Al comparar notamos que en un arreglo lineal la
localización de los datos se puede realizar rápidamente siempre y cuando el arreglo
este ordenado, no sucede lo mismo con las operaciones de inserción y eliminación
que resultan costosas (por el tiempo que consumen); En una lista enlazada las
inserciones y las eliminaciones son fáciles pero una búsqueda puede resultar costosa.
Un Árbol Binario de Búsqueda o Árbol Binario Ordenado, es uno en el cual para todo
nodo T del árbol, debe cumplirse que todos los valores de los nodos del subárbol
izquierdo de T deben ser menores o iguales al valor del nodo T; de igual manera todos
los valores de los nodos del subárbol derecho de T deben ser mayores al valor del
nodo T.
Ejemplo 01: DFEBACG Ejemplo 02: 40, 60, 50, 33, 55, 11
Ejercicio_01: 120, 87, 140, 43, 99, 130, 22, 65, 93, 135, 56
Ejercicio_02: J, R, D, G, T, E, M, H, P, A, F, Q
Algoritmo de Búsqueda en Árbol Binario Ordenado
Para un árbol binario ordenado representado por los arreglos INFO, IZQ, DER. El
siguiente algoritmo encuentra la posición POS del elemento y la posición del padre
(PAD).
Se debe tener en cuenta lo siguiente:
1. Si POS = 0 y PAD = 0 El árbol está vacío
2. Si POS <> 0 y PAD = 0 El elemento es la raíz del árbol
3. Si POS = 0 y PAD <> 0 Elemento no está en el árbol, pero puede ser
añadido al árbol como hijo del nodo de posición PAD
1. Inicio
2. Si RAIZ = 0 entonces
POS ? 0
PAD ? 0 (Árbol vacío)
Salir
Fin_si
3. Si ELEMENTO = INFO[RAIZ] entonces
POS ? RAIZ
PAD ? 0 (Elemento está en la raíz)
Salir
Fin_si
4. Si ELEMENTO < INFO[RAIZ] entonces
PTR ? IZQ[RAIZ]; SALVA ? RAIZ
Caso contrario (Inicializa PTR y SALVA)
PTR ? DER[RAIZ]; SALVA ? RAIZ
Fin_si
5. Mientras PTR<>0 hacer
Si ELEMENTO = INFO[PTR] entonces
POS ? PTR; PAD ? SALVA
Salir
Fin_si (Busca
elemento)
Si ELEMENTO < INFO[PTR] entonces
SALVA ? PTR; PTR ? IZQ[PTR]
Caso contrario
SALVA ? PTR; PTR ? DER[PTR]
Fin_si
Fin_mientras
6. POS ? 0; PAD ? SALVA (Búsqueda sin resultado)
7. FIN
RAIZ = 5
Buscar 50
Algoritmo de Inserción en Árbol Binario Ordenado
(Añade elemento en posición ordenada)
1) Inicio
2) Si POS <>O entonces
Salir
Fin_si
3) Si DISPO = 0 entonces
Escribir “desbordamiento”
Salir
Fin_si
4) Nuevo ? DISP; DISP ? IZQ[DISP]
INFO[Nuevo] ? elemento
POS ? Nuevo
IZQ[Nuevo] ? 0; DER[Nuevo] ? 0;
5) Si PAD = 0 entonces
RAIZ ? nuevo
Caso contrario
Si elemento < INFO[PAD] entonces
IZQ[PAD] ? nuevo
Caso contrario
DER[PAD] ? nuevo
Fin_si
6) Fin
POS = 0 PAD = 6 DISP = 1 elemento = 35
Eliminación de un Elemento
La eliminación debe conservar el orden de los elementos de l árbol, se tiene en
consideración los siguientes casos:
ü El elemento es un nodo terminal (o descendientes)
ü El elemento tiene un descendiente
ü El elemento tiene dos descendientes
ALGORITMO CASO 1 (Nodo terminal)
1. INICIO
2. Si IZQ[POS] = 0 y DER[POS] = 0 entonces
hijo ? 0
caso contrario
Si IZQ[POS] <> 0 entonces
hijo ? IZQ[POS]
caso contrario
hijo ? DER[POS]
fin_si
fin_si
3. Si PAD<> 0 entonces
Si POS = IZQ[PAD] entonces
IZQ[PAD] ? hijo
Caso contrario
DER[PAD] ? hijo
Fin_si
Caso contrario
RAIZ ? hijo
Fin_si
4. Salir
5. FIN
ALGORITMO CASO 2 (Nodo que tiene dos hijos)
Elimina nodo N que tiene dos hijos, de la posición POS. El puntero PAD tiene la
posición del Padre de N. Si PAD = 0 N es el nodo RAIZ.
SUC puntero que da la posición del sucesor inorden de N.
PADSUC puntero que da la posición del padre del sucesor inorden.
1. INICIO
2. PTR ? DER[POS]; SALVA ? POS
Mientras IZQ[PTR] <> 0 hacer
SALVA ? PTR
PTR ? IZQ[PTR]
Fin_mientras
SUC ? PTR; PADSUC ? SALVA
3. Eliminar sucesor inorden con algoritmo Caso 1
4. Si PAD<> 0 entonces
Si POS = IZQ[PAD] entonces
IZQ[PAD] ? SUC
Caso contrario
DER[PAD] ? SUC
Fin_si
Caso contrario
RAIZ ? SUC
Fin_si
IZQ[SUC] ? IZQ[POS]
DER[SUC] ? DER[POS]
5. FIN