1. ESTRUCTURA DE DATOS
Contenido:
❑ Tipo abstracto de datos (D2)
❑ Arboles ABB (D13)
❑ Arboles AVL (D33)
❑ Arboles biselados (D47)
Prof. David Candela Arce
3. TIPO ABSTRACTO DE DATOS ÁRBOL BINARIO
▪ La estructura de árbol binario constituye un tipo abstracto de
datos; las operaciones básicas que definen el TAD árbol binario
son las siguientes:
▪ Tipo de dato: dato que se almacena en los nodos del árbol.
Operaciones
1. CrearÁrbol: inicia el árbol como vacío.
2. Construir: crea un árbol con un elemento raíz y dos
ramas, izquierda y derecha que son a su vez árboles.
3. EsVacio: comprueba si el árbol no tiene nodos.
4. Raiz: devuelve el nodo raíz.
4. TAD ÁRBOL BINARIO
5. Izquierdo: obtiene la rama o subárbol izquierdo de un árbol
dado.
6. Derecho: obtiene la rama o subárbol derecho de un árbol
dado.
7. Borrar: elimina del árbol el nodo con un elemento
determinado.
8. Pertenece: determina si un elemento se encuentra en el árbol.
5. OPERACIONES EN ARBOLES BINARIOS
Algunas de las operaciones típicas que se realizan en árboles
binarios son éstas:
▪ Determinar su altura.
▪ Determinar su número de elementos.
▪ Hacer una copia.
▪ Visualizar el árbol binario en pantalla o en impresora.
▪ Determinar si dos árboles binarios son idénticos.
▪ Borrar (eliminar el árbol).
▪ Si es un árbol de expresión, evaluar la expresión.
6. OPERACIONES EN ARBOLES BINARIOS
▪ Todas estas operaciones se pueden realizar recorriendo el árbol
binario de un modo sistemático. El recorrido es la operación de
visita al árbol, o lo que es lo mismo, la visita a cada nodo del
árbol una vez y sólo una. La visita de un árbol es necesaria en
muchas ocasiones, por ejemplo, si se desea imprimir la
información contenida en cada nodo. Existen diferentes formas
de visitar o recorrer un árbol que se estudiarán más adelante.
7. ESTRUCTURA DE UN ÁRBOL BINARIO
▪ Un árbol binario se construye con nodos. Cada nodo debe
contener el campo dato (datos a almacenar) y dos campos de
enlace (apuntador), uno al subárbol izquierdo (izquierdo, izdo) y
otro al subárbol derecho (derecho, dcho). El valor NULL indica
un árbol o un subárbol vacío.
8. ESTRUCTURA DE UN ÁRBOL BINARIO
▪ La siguiente figura muestra la representación enlazada de dos
árboles binarios de raíz A. El primero, es un árbol degenerado a
la izquierda; el segundo, es un árbol binario completo de
profundidad 4.
Representación enlazada de dos arboles binarios
Se puede observar que los nodos de un árbol binario que son
hojas se caracterizan por tener sus dos campos de enlace a NULL.
9. TIPO ABSTRACTO DE DATOS
▪ Un tipo abstracto de datos (TAD) es una descripción lógica de
un conjunto de datos y las operaciones que se pueden realizar
sobre ellos, sin importar cómo se implementen. Se centra en la
abstracción de la información, permitiendo trabajar con los
datos a un nivel superior sin preocuparse por los detalles de
implementación.
10. MAS DETALLES
▪ Definición:
Un TAD se define por un conjunto de valores que pueden tomar
los datos y las operaciones que los manipulan.
▪ Abstracción:
La abstracción en un TAD se refiere a la independencia de la
implementación. Se puede implementar el mismo TAD de
diferentes maneras sin afectar a los usuarios que lo utilizan,
siempre y cuando la interfaz (las operaciones definidas) se
mantenga consistente.
▪ Ejemplos:
Pila, cola, lista, árbol, grafo.
11. MAS DETALLES
Componentes:
▪ Interfaz: Conjunto de operaciones que se pueden realizar sobre
los datos.
▪ Implementación: Detalle de cómo se almacenan los datos y
cómo se realizan las operaciones.
Ventajas:
▪ Encapsulación: Permite ocultar la implementación interna del
TAD al usuario, lo que facilita el mantenimiento y la evolución
del código.
▪ Reutilización: Los TADs pueden ser reutilizados en diferentes
contextos y aplicaciones.
▪ Desarrollo modular: El diseño de sistemas complejos se
facilita al dividir la lógica en TADs.
12. MAS DETALLES
Relación con estructuras de datos:
Un TAD no es lo mismo que una estructura de datos. Un TAD
define una colección de operaciones y valores, mientras que una
estructura de datos es una forma de organizar y almacenar los
datos.
Aplicaciones:
Los TADs son fundamentales en la programación orientada a
objetos, donde se utilizan para modelar objetos y sus operaciones.
En resumen, un TAD es una herramienta poderosa para organizar
y manipular datos, permitiendo una gestión eficiente y flexible de la
información en los sistemas de software.
14. ARBOLES ABB
▪ Un árbol binario de búsqueda (ABB) es un árbol binario tal que
el valor de cada nodo es mayor que los valores de su subárbol
izquierdo y es menor que los valores de su subárbol derecho y,
además, ambos subárboles son árboles binarios de búsqueda.
15. CARACTERÍSTICAS
▪ Un árbol binario de búsqueda (ABB) es un árbol binario con la
propiedad de que todos los elementos almacenados en el
subárbol izquierdo de cualquier nodo x son menores que el
elemento almacenado en x, y todos los elementos almacenados
en el subárbol derecho de x son mayores que el elemento
almacenado en x.
16. OPERACIONES BÁSICAS EN UN ABB
▪ Los árboles binarios de búsqueda, al igual que los árboles
binarios, tienen naturaleza recursiva y, en consecuencia, las
operaciones sobre los árboles son recursivas, si bien siempre
se tiene la opción de realizarlas de forma iterativa. Estas
operaciones son:
▪ Búsqueda de un nodo. Devuelve la referencia al nodo del árbol,
o NULL.
▪ Inserción de un nodo. Crea un nodo con su dato asociado y lo
añade, en orden, al árbol.
▪ Borrado de un nodo. Busca el nodo del árbol que contiene un
dato y lo quita del árbol. El árbol debe seguir siendo de
búsqueda.
▪ Recorrido de un árbol. Los mismos recorridos de un árbol
binario preorden, inorden y postorden.
17. BÚSQUEDA EN UN ABB
La búsqueda de un nodo comienza en el nodo raíz y sigue estos
pasos:
▪ 1. La clave buscada se compara con la clave del nodo raíz.
▪ 2. Si las claves son iguales, la búsqueda se detiene.
▪ 3. Si la clave buscada es mayor que la clave raíz, la búsqueda
se reanuda en el subárbol derecho. Si la clave buscada es
menor que la clave raíz, la búsqueda se reanuda con el
subárbol izquierdo.
19. BÚSQUEDA EN UN ABB
Implementación:
▪ Si se desea encontrar un nodo en el árbol que contenga una
información determinada. La función pública buscar() de la
Clase ArbolBinario realiza una llamada a la función privada
buscar() de la clase ArbolBinario que tiene dos parámetros, un
puntero a un Nodo y el dato que se busca. Como resultado, la
función devuelve un puntero al nodo en el que se almacena la
información; en el caso de que la información no se encuentre
se devuelve el valor NULL.
20. BÚSQUEDA EN UN ABB
▪ El algoritmo de búsqueda es el siguiente:
1. Si el nodo raíz contiene el dato buscado, la tarea es fácil:
el resultado es, simplemente, su referencia y termina el
algoritmo.
2. Si el árbol no está vacío, el subárbol específico por donde
proseguir depende de que el dato requerido sea menor o
mayor que el dato del raíz.
3. El algoritmo termina si el árbol está vacío, en cuyo caso
devuelve NULL.
21. INSERTAR UN NODO EN UN ABB
▪ Para añadir un nodo al árbol se sigue el camino de búsqueda, y
al final del camino se enlaza el nuevo nodo, por consiguiente,
siempre se inserta como hoja del árbol. El árbol que resulta
después de insertar sigue siendo siempre de búsqueda.
▪ En esencia, el algoritmo de inserción se apoya en la búsqueda
de un elemento, de modo que si se encuentra el elemento
buscado, no es necesario hacer nada (o bien se usa una
estructura de datos auxiliar para almacenar la información); en
caso contrario, se inserta el nuevo elemento justo en el lugar
donde ha acabado la búsqueda (es decir, en el lugar donde
habría estado en el caso de existir).
22. INSERTAR UN NODO EN UN ABB
▪ Por ejemplo, al árbol de la siguiente figura se le va a añadir el
nodo 8. El proceso describe un camino de búsqueda que
comienza en la raíz 25; el nodo 8 debe estar en el subárbol
izquierdo de 25 (8 < 25). El nodo 10 es la raíz del subárbol
actual, el nodo 8 debe estar en el subárbol izquierdo (8 < 10),
que está actualmente vacío y, por tanto, ha terminado el camino
de búsqueda. El nodo 8 se enlaza como hijo izquierdo del nodo
10.
Inserción en un árbol binario de búsqueda
24. INSERTAR UN NODO EN UN ABB
Insertar un elemento con clave 80 en el árbol binario de búsqueda
siguiente:
25. INSERTAR UN NODO EN UN ABB
A continuación insertar un elemento con clave 36 en el árbol
binario de búsqueda resultante:
26. IMPLEMENTACIÓN
▪ La función insertar() de la clase ArbolBinario es la interfaz de la
operación, llama la función recursiva que realiza la operación y
devuelve la raíz del nuevo árbol. A esta función interna se le
pasa la raíz actual, a partir de ella se describe el camino de
búsqueda y, al final, se enlaza. En un árbol binario de búsqueda
no hay nodos duplicados, por ello si se encuentra un nodo igual
que el que se desea insertar, se lanza una excepción (o una
nueva función que inserte en una estructura de datos auxiliar
del propio nodo).
27. ELIMINAR UN NODO EN UN ABB
▪ La operación de borrado de un nodo es también una extensión
de la operación de búsqueda, si bien más compleja que la
inserción, debido a que el nodo a suprimir puede ser cualquiera
y la operación debe mantener la estructura de árbol binario de
búsqueda después de quitar el nodo.
Los pasos a seguir son:
1. Buscar en el árbol la posición de “nodo a eliminar”.
2. Si el nodo a suprimir tiene menos de dos hijos, reajustar los
enlaces de su antecesor.
3. Si el nodo tiene dos hijos (rama izquierda y derecha), es
necesario subir a la posición que éste ocupa el dato más
próximo de sus subárboles (el inmediatamente superior o el
inmediatamente inferior) con el fin de mantener la estructura
árbol binario de búsqueda.
28. ELIMINAR UN NODO EN UN ABB
▪ Los ejemplos siguientes muestran estas dos circunstancias, el
primero elimina un nodo sin descendientes, el segundo elimina
un nodo que, a su vez, es la raíz de un árbol con dos ramas no
vacías.
29. ELIMINAR UN NODO EN UN ABB
Suprimir el elemento de la clave 36 del siguiente árbol binario de
búsqueda:
El nodo del árbol donde se encuentra la clave 36 es una hoja, por
ello simplemente se reajustan los enlaces del nodo precedente en
el camino de búsqueda. El árbol resultante:
30. ELIMINAR UN NODO EN UN ABB
Borrar el elemento de clave 60 del siguiente árbol:
Se reemplaza 60 por el elemento mayor (55) en su subárbol
izquierdo, o por el elemento más pequeño (70) en su subárbol
derecho. Si se opta por reemplazar por el mayor del subárbol
izquierdo, se mueve el 55 al raíz del subárbol y se reajusta el árbol.
31. IMPLEMENTACIÓN
▪ La función eliminar() de la clase ArbolBinario es el interfaz de la
operación, se le pasa el elemento que se va a buscar en el
árbol para retirar su nodo; llama al método sobrecargado,
privado, eliminar() con la raíz del árbol y el elemento.
▪ La función lo primero que hace es buscar el nodo, siguiendo el
camino de búsqueda. Una vez encontrado, se presentan dos
casos claramente diferenciados. El primero, si el nodo a
eliminar es una hoja o tiene un único descendiente, resulta una
tarea fácil, ya que lo único que hay que hacer es asignar al
enlace del nodo padre (según el camino de búsqueda) el
descendiente del nodo a eliminar.
32. IMPLEMENTACIÓN
▪ El segundo caso, que el nodo tenga las dos ramas no vacías;
esto exige, para mantener la estructura de árbol de búsqueda,
reemplazar el dato del nodo por la mayor de las claves menores
en el subárbol (otra posible alternativa: reemplazar el dato del
nodo por la menor de las claves mayores). Como las claves
menores están en la rama izquierda, se baja al primer nodo de
la rama izquierda, y se continúa bajando por las ramas derecha
(claves mayores) hasta alcanzar el nodo que no tiene rama
derecha. Éste es el mayor de los menores, cuyo dato debe
reemplazar al del nodo a eliminar. Lo que se hace es copiar el
valor del dato y enlazar su padre con el hijo izquierdo. La
función reemplazar() realiza la tarea descrita.
34. ARBOLES AVL
▪ Un árbol AVL es un tipo especial de árbol binario ideado por los
matemáticos soviéticos Adelson-Velskii y Landis. Fue el primer
árbol de búsqueda binario auto-balanceable que se ideó.
35. ÁRBOL BINARIO EQUILIBRADO. ARBOLES AVL
▪ Un árbol totalmente equilibrado se caracteriza por que la altura
de la rama izquierda es igual que la altura de la rama derecha
para cada uno de los nodos del árbol. Es un árbol ideal, no
siempre se puede conseguir que el árbol esté totalmente
balanceado.
▪ La estructura de datos de árbol equilibrado que se utiliza es la
árbol AVL. El nombre es en honor de Adelson-Velskii-Landis
que fueron los primeros científicos en estudiar las propiedades
de esta estructura de datos. Son árboles ordenados o de
búsqueda que, además, cumplen la condición de balanceo para
cada uno de los nodos.
37. ÁRBOL BINARIO EQUILIBRADO. ARBOLES AVL
▪ La siguiente figura muestra dos árboles de búsqueda, el de la
izquierda está equilibrado. El de la derecha es el resultado de
insertar la clave 2 en el anterior, según el algoritmo de inserción
en árboles de búsqueda. La inserción provoca que se viole la
condición de equilibrio en el nodo raíz del árbol.
Dos arboles de búsqueda, el de la izquierda equilibrado, el otro no.
38. ÁRBOL BINARIO EQUILIBRADO. ARBOLES AVL
▪ La condición de equilibrio de cada nodo implica una restricción
en las alturas de los subárboles de un árbol AVL. Si Vr es la raíz
de cualquier subárbol de un árbol equilibrado, y h la altura de la
rama izquierda entonces la altura de la rama derecha puede
tomar los valores: h-1, h, h+1.
39. ÁRBOL BINARIO EQUILIBRADO. ARBOLES AVL
▪ Esto aconseja asociar a cada nodo el parámetro denominado
factor de equilibrio o balance de un nodo. Se define como la
altura del subárbol derecho menos la altura del subárbol
izquierdo correspondiente. El factor de equilibrio de cada nodo
en un árbol equilibrado puede tomar los valores: 1, -1 o 0. La
siguiente figura muestra un árbol balanceado con el factor de
equilibrio de cada nodo.
Árbol equilibrado con el factor de equilibrio de cada nodo.
41. INSERCION EN ARBOLES AVL: ROTACIONES
▪ Los árboles equilibrados, árboles AVL, son árboles de búsqueda
y, por consiguiente, para añadir un elemento se ha de seguir el
mismo proceso que en los árboles de búsqueda. Se compara la
nueva clave con la clave de la raíz, continúa por la rama
izquierda o derecha según sea menor o mayor (describe el
camino de búsqueda), termina insertándose como nodo hoja.
Sin embargo, la nueva inserción puede hacer que aumente la
altura de una rama, de manera que cambie el factor de
equilibrio del nodo raíz de dicha rama.
42. INSERCION EN ARBOLES AVL: ROTACIONES
▪ Este hecho hace necesario que el algoritmo de inserción,
regrese por el camino de búsqueda actualizando el factor de
equilibrio de los nodos. La siguiente figura muestra un árbol
equilibrado y el mismo árbol justo después de la inserción de
una nueva clave que provoca que rompa la condición de
balanceo.
Árbol equilibrado; el mismo después de insertar la clave 17.
44. PROCESO DE INSERCION DE UN
NUEVO NODO
▪ Inicialmente, se aplica el algoritmo de inserción en un árbol de
búsqueda, éste sigue el camino de búsqueda hasta llegar al
fondo del árbol y se enlaza como nodo hoja y con factor de
equilibrio 0. Pero el proceso no puede terminar, es necesario
recorrer el camino de búsqueda en sentido contrario, hacia la
raíz, para actualizar el campo adicional factor de equilibrio.
Después de una inserción sólo los nodos que se encuentran en
el camino de búsqueda pueden haber cambiado el factor de
equilibrio.
45. PROCESO DE INSERCION DE UN
NUEVO NODO
▪ La actualización del factor de equilibrio (fe) puede hacer que
éste mejore. Esto ocurre cuando un nodo está descompensado
a la izquierda y se inserta el nuevo nodo en la rama izquierda,
al crecer en altura dicha rama el fe se hace 0, se ha mejorado el
equilibrio. La siguiente figura muestra el árbol a) en el que el
nodo 90 tiene fe = 1; en el árbol b), después de insertar el nodo
con clave 60, el nodo 90 tiene fe = 0.
Mejora en la condición de equilibrio al insertar un nuevo nodo con clave 60
46. CARACTERÍSTICAS
▪ Un árbol AVL es un tipo de árbol de búsqueda binario (BST)
autoequilibrado, lo que significa que mantiene la diferencia
entre las alturas de los subárboles izquierdo y derecho de cada
nodo en un máximo de 1. Esta propiedad asegura que las
operaciones de búsqueda, inserción y eliminación hace que los
árboles AVL sean eficientes para una amplia gama de
aplicaciones.
48. ARBOLES BISELADOS
▪ Un árbol biselado o árbol splay es un árbol binario de búsqueda
auto-balanceable, con la propiedad adicional de que a los
elementos accedidos recientemente se accederá más
rápidamente en accesos posteriores.
49. ARBOLES BISELADOS
▪ En ciencias de la computación, un árbol binario de búsqueda
auto-balanceable o equilibrado es un árbol binario de búsqueda
que intenta mantener su altura, o el número de niveles de nodos
bajo la raíz, tan pequeños como sea posible en todo momento,
automáticamente.
50. ARBOLES BISELADOS
▪ Esto es importante, ya que muchas operaciones en un árbol de
búsqueda binaria tardan un tiempo proporcional a la altura del
árbol, y los árboles binarios de búsqueda ordinarios pueden
tomar alturas muy grandes en situaciones normales, como
cuando las claves son insertadas en orden.
51. ARBOLES BISELADOS
▪ Mantener baja la altura se consigue habitualmente realizando
transformaciones en el árbol, como la rotación de árboles, en
momentos clave.
52. ARBOLES BISELADOS
▪ Un árbol biselado, también conocido como árbol desplegado o
splay tree, es un árbol binario de búsqueda autobalanceable
que tiene la propiedad de que los elementos accedidos
recientemente se pueden acceder más rápidamente en accesos
posteriores. Esta propiedad se logra mediante una operación
llamada biselación, que mueve el nodo accedido a la raíz del
árbol.
53. MAS DETALLES SOBRE LOS ARBOLES BISELADOS
▪ Autobalanceamiento:
Los árboles biselados se mantienen balanceados a través de la
operación de biselación, lo que ayuda a garantizar un tiempo de
búsqueda, inserción y eliminación eficiente.
54. MAS DETALLES SOBRE LOS ARBOLES BISELADOS
▪ Biselacion:
La biselación es una operación que traslada un nodo al que se
accede a la raíz del árbol. Esto se logra mediante una serie de
rotaciones que acercan el nodo a la raíz.
55. MAS DETALLES SOBRE LOS ARBOLES BISELADOS
▪ Eficiencia en accesos recientes:
Al mover los nodos accedidos recientemente a la raíz, los
árboles biselados mejoran el rendimiento para los accesos
posteriores a esos mismos nodos.
56. MAS DETALLES SOBRE LOS ARBOLES BISELADOS
▪ Aplicaciones:
Los árboles biselados se pueden utilizar en situaciones donde
se espera que los accesos a ciertos elementos sean más
frecuentes que otros, como en la implementación de caches o
la gestión de datos que se utilizan con mayor frecuencia.
57. COMPARACIÓN CON OTROS TIPOS DE ARBOLES
▪ Arboles binarios de búsqueda (ABB):
Los árboles binarios de búsqueda son un tipo de árbol binario
que se utiliza para almacenar y recuperar datos de forma
eficiente. Los árboles biselados son una extensión de los ABB
que incorporan la propiedad de autobalanceo mediante la
operación de biselación.
58. COMPARACIÓN CON OTROS TIPOS DE ARBOLES
▪ Arboles AVL:
Los árboles AVL son otro tipo de árbol binario de búsqueda
autobalanceable. La diferencia principal entre los árboles
biselados y los árboles AVL es que los árboles biselados se
mantienen balanceados moviendo los nodos a la raíz, mientras
que los árboles AVL se mantienen balanceados mediante
rotaciones.
59. CARACTERÍSTICAS
▪ Los árboles biselados, también conocidos como árboles splay,
son árboles binarios de búsqueda autobalanceables que tienen
la peculiaridad de que los elementos accedidos recientemente
se accederán más rápidamente en accesos posteriores. Esta
propiedad se logra moviendo el nodo accedido hacia la raíz del
árbol mediante una serie de rotaciones, lo que mejora el
rendimiento de las operaciones de búsqueda.