ARBOLES
PARTE 1
CLASE N°12
CLASE N°12
Leissi M. Castañeda León
Que veremos hoy?
Arboles
1. Arboles Binarios
2. Arboles Binarios de Búsqueda 3. Arboles AVL
4. Arboles B 4. Arboles B 5. Arboles B+
6. Arboles Roji-Negro
Árboles
Introducción
Se han estudiado estructuras de datos lineales, tanto
estáticas como dinámicas: a cada elemento siempre le sucede o le precede como máximo otro elemento.
Ahora se va a introducir el concepto de ramificación
entre nodos para estudiar la estructura de datos árboles. entre nodos para estudiar la estructura de datos árboles.
Los árboles son las estructuras de datos no lineales
(cada elemento puede tener más de un sucesor) y
dinámicas (cambiar de forma o tamaño durante la
ejecución) de datos más importantes.
Introducción
Los árboles balanceados o AVL son la estructura de
datos más eficiente para trabajar con la memoria
principal (o interna), mientras que los árboles B y B+ con la memoria secundaria (externa).
Árboles
Un árbol se puede definir como una estructura
jerárquica aplicada sobre una colección de elementos u objetos llamados nodos, uno de los cuales se denomina
raiz.
Formalmente se define un árbol de tipo T como una
estructura homogénea resultado de la concatenación de un elemento de tipo T con un número finito de árboles disjuntos, llamados subárboles.
Una forma particular de árbol es el árbol vacío.
Árboles
Estructuras recursivas, ya que cada subárbol es a su
vez un árbol.
Un árbol se puede representar de diferentes formas
(notaciones) y todas ellas se consideran equivalentes:
Diagramas de Venn Diagramas de Venn
Anidación de paréntesis
Notación decimal de Dewey Notación Indentada
Grafo (se distinguen nodos y arcos)
Ejemplo
8
c) 1.A, 1.1.B,
1.1.1.D, 1.1.1.1.I,
1.1.2.E, 1.1.3.F,
1.1.3.1.J,
A
B C
B C
D E F G H
Características y Propiedades de los
árboles
Todo árbol que no es vacío tiene un
único nodo raíz
Un nodo X es descendiente directo de
un nodo Y, si el nodo X es apuntado por el nodo Y. En este caso decimos: X es hijo de Y.
A
B C
es hijo de Y.
Un nodo X es antecesor directo de un
nodo Y, si el nodo X apunta al nodo Y. En este caso decimos: X es padre de Y.
Todos los nodos que son
descendientes directos – hijos – de un mismo nodo – padre – son hermanos.
11
D E F G H
Características y Propiedades de los
árboles (cont.)
Todo nodo que no tiene ramificaciones –
hijos-, se conoce como terminal u hoja.
Todo nodo que no es raíz ni hoja, se
conoce como interior.
Grado es el número de descendientes
directos de un determinado nodo.
A
B C
directos de un determinado nodo.
Grado del árbol es el máximo grado de
todos los nodos del árbol.
Nivel es el número de arcos que deben
ser recorridos para llegar a un determinado nodo. Raíz nivel 1.
Altura es el máximo número de niveles
de todos los nodos del árbol.
12
D E F G H
Longitud de camino interno y externo
Se define la longitud de camino del nodo X como el
número de arcos que se deben recorrer para llegar desde la raíz hasta el nodo X.
Por definición la raíz tiene longitud de camino 1, sus
descendientes directos longitud de camino 2 y así sucesivamente.
Longitud de Camino Interno (LCI)
La LCI del árbol es la suma de las longitudes de camino
de todos los nodos del árbol.
Esta medida es importante porque permite conocer los
caminos que tiene el árbol.
Se calcula por medio de la siguiente fórmula: Se calcula por medio de la siguiente fórmula:
Donde i representa el nivel de árbol, h su altura y el
número de nodos en el nivel i.
La media de la longitud de camino interno: LCIM=LCI/n
Ejemplo
∑
=
=
hi
i
i
n
LCI
1
*
A
B C
LCI = 1*1 + 2*2 + 5*3 + 4*4 = 36
D E F G H
Longitud de camino externo (LCE)
Para definir la longitud de camino externo de un árbol es
necesario primero explicar los conceptos de árbol
extendido y nodo especial.
Árbol extendido: aquel en el que el número de hijos de Árbol extendido: aquel en el que el número de hijos de
cada nodo es igual al grado del árbol. Si algún nodo no cumple con esta condición, entonces deben
incorporarse los nodos especiales requeridos.
Nodos especiales: tienen como objetivo reemplazar las
ramas vacías o nulas, no puede tener descendientes. Se representa en forma de cuadrado.
Longitud de camino externo (LCE)
Podemos definir entonces la LCE de un árbol como la
suma de las longitudes de camino de todos los nodos especiales del árbol. Se calcula por medio de la
siguiente fórmula:
∑
+=
1*
h
ei
i
n
LCE
Donde i representa el nivel del árbol, h su altura y nei el
número de nodos especiales en el nivel i. Observe que i comienza desde 2, puesto que la raíz se encuentra en el nivel i y no puede ser nodo especial.
La media: LCEM=LCE/ne
Ejemplo
∑
+=
=
12
*
h
i
ei
i
n
LCE
A
B C
D E F G H
LCE = 1*2 + 1*3 + 11*4 + 12*5 = 109
D E F G H
Ejercicio
Hallar el camino interno, media del camino interno y el
Árboles Binarios
Árboles Binarios
Un árbol ordenado es aquel en el cual la distribución de
las ramas sigue un cierto orden.
Los árboles ordenados de grado 2 son conocidos como:
árboles binarios. árboles binarios.
En un árbol binario cada nodo puede tener como
máximo dos subárboles y éstos se distinguen entre sí como subárbol izquierdo y subárbol derecho, según su ubicación con respecto a la raíz.
Árboles Binarios: aplicaciones
Las aplicaciones de los arboles binarios son muy
variadas ya que se les puede utilizar para representar una estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos.
Ejemplo:
Ejemplo:
Árboles Binarios de Búsqueda
22
27 14
7
11
47
59
77 32
+ *
A B
^
3.5
Representación de una expresión algebraica.
23
A B
/
Árbol Genealógico.
Osvaldo Cario Battistuti
Jose Cario Maria Battistuti
24
Jose Cario Scandallo
Maria Battistuti Valiente
Antonio Cario Godoy
Maria Scandallo Miscoria
Maria Valiente Martin
Árboles binarios distintos, similares y
equivalentes
Distintos: cuando sus estructuras, la distribución de
nodos y arcos son diferentes.
A) A A
B B
B)
A
B C
D
A
B
Árboles binarios distintos, similares y
equivalentes
Similares: cuando sus estructuras son idénticas pero la
información que contienen sus nodos difiere entre sí
A) A V
B F
B)
A
B
C
D
P
R T
Árboles binarios distintos, similares y
equivalentes
Equivalentes: aquellos que son similares y además la
información de sus nodos contienen la misma información
A)
A A
A)
B
B
B) A
B
C
D
A
C B
¿Qué relación encuentra en los siguientes
árboles binarios?
A) A
B C
D
B) A
X L
N D
C) A
B
D
C
D) A
B
C
A) A
B C
D
B) A
X L
N
C) A D) A
- El árbol de la figura C es distinto de los árboles de la figura A,B - Los árboles de la figura A, B y D son similares.
- Los árboles de la figura A y D son equivalentes.
B
D
C
B
C
Árboles binarios completos
Se define un árbol binario completo como un árbol en el
que todos sus nodos, excepto los del último nivel, tienen dos hijos; el subárbol izquierdo y el subárbol derecho. Ejemplo:
A) DE ALTURA 3:
A
B C
D E
G F
B) DE ALTURA 4:
A
B C
D E F
G
Se puede calcular el número de nodos de un árbol binario completo de altura h aplicando la siguiente fórmula:
NÚMERO DE NODOSABC = (2^h) - 1
Donde ABC significa árbol binario completo, y h la altura del árbol. Así, por ejemplo, un árbol binario completo de altura 5 tendrá 31 nodos, de altura 9 tendrá 511 nodos y un árbol de 17 tendrá 131071 nodos.
Representación de árbol general a binario
1. Deben enlazarse los hijos de cada nodo en forma
horizontal
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 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. Debe rotarse el diagrama resultante aproximadamente
A
B C
D E F G H
I J K L
A
B A
B C
D E F G H
I J K L
F D
E
C
J
K
I G
Representación de árboles binarios en
memoria
Hay dos formas tradicionales de representarlos:
Por medio de datos tipo punteros también conocidos como
variables dinámicas o listas.
Por medio de arreglos.
Sin embargo la más utilizada es la primera, puesto que Sin embargo la más utilizada es la primera, puesto que
es la más natural para tratar este tipo de estructuras.
Los nodos del árbol binario serán representados como
registros que contendrán como mínimo 3 campos: uno almacenará la información del nodo y los dos restantes se utilizarán apuntarán al subarbol izquierdo y derecho del subarbol en cuestión.
Árboles binarios
Cada nodo se representa gráficamente de la siguiente
manera:
T=
La definición de un árbol binario en lenguaje algorítmico
Izq
Info
Der
La definición de un árbol binario en lenguaje algorítmico
es:
Enlace=^nodo Nodo=registro
izq: tipo enlace info: tipo de dato der: tipo enlace {fin de la definicion}
+
* ^
*
+
A B 3.5 ^
/
C D
A B / 3.5
C D
NIL NIL NIL NIL
NIL NIL NIL NIL
Operaciones en árboles binarios
Una de las operaciones básicas es la creación del
mismo en memoria.
Otras operaciones:
Recorrer todos los nodos Insertar un nuevo nodo Insertar un nuevo nodo
Eliminar alguno de los existentes Buscar un valor determinado
A continuación se presentará el algoritmo de creación de
un árbol
Crea_arbol(NODO)
1. Leer informacion(Hacer NODO^.INFO INFOR) 2. Escribir ”¿existe nodo por izquierda?: 1(Si) – 0(No)” 3. Leer respuesta (RESP)
4. Si RESP es afirmativa entonces
CREA (OTRO) {crear un nuevo nodo} Hacer NODO ^.IZQ OTRO
Regresar a Crea_arbol con NODO ^.IZQ {llamada recursiva} si no
Hacer NODO ^.IZQ NIL Hacer NODO ^.IZQ NIL
6. {fin condicional del paso 4}
7. Escribir “¿existe nodo derecha? : 1(Si) – 0(No)” 8. Leer respuesta (RESP)
9. Si respuesta es afirmativa entonces
CREA (OTRO) {crear un nuevo nodo} Hacer NODO ^.DER OTRO
Regresar a Crea_arbol con NODO ^.DER {llamada recursiva} si no
Hacer NODO ^.DER NIL
Recorrido de un árbol binario
Una de las operaciones más importantes, que lo que
hace es visitar los nodos del árbol en forma ordenada, de tal forma que todos los nodos sean visitados una sola vez.
Hay tres manera de recorrer un árbol : en inorden, Hay tres manera de recorrer un árbol : en inorden,
preorden y postorden:
INORDEN
Recorrer el subarbol izquierdo en inorden. Examinar la raíz.
Recorrer el subarbol derecho en inorden.
Recorrido de un árbol binario
PREORDEN
Examinar la raíz.
Recorrer el subarbol izquierdo en preorden. recorrer el subarbol derecho en preorden.
POSTORDEN
Recorrer el subarbol izquierdo en postorden. Recorrer el subarbol derecho en postorden. Examinar la raíz.
Ejemplo de recorrido
D E B
F G C
A PREORDEN: ABDECFG INORDEN: DBEAFCG POSORDEN: DEBFGCA
+
41
A B *
/ 3.5
^ +
C D PREORDEN: +*AB^/CD3.5
D B
E F
C A
Ejemplo de recorrido
K
G H I J
Recorrido Preorden
PREORDEN(NODO).
1. Si NODO ≠≠≠≠ NIL entonces
visitar el NODO {escribir NODO^.INFO} regresar a PREORDEN con NODO^.IZQ
{llamada recursiva a PREORDEN con la {llamada recursiva a PREORDEN con la rama izquierda del nodo}
regresar a PREORDEN con NODO^.DER
{llamada recursiva a PREORDEN con la rama derecha del nodo}
INORDEN(NODO).
1. Si NODO ≠≠≠≠ NIL entonces
regresar a INORDEN con NODO^.IZQ
{llamada recursiva a INORDEN con la rama izquierda del nodo}
Recorrido Inorden
izquierda del nodo}
visitar el NODO {escribir NODO^.INFO} regresar a INORDEN con NODO^.DER
{llamada recursiva a INORDEN con la rama derecha del nodo}
POSTORDEN(NODO).
1. Si NODO ≠≠≠≠ NIL entonces
regresar a POSTORDEN con NODO^.IZQ
{llamada recursiva a POSTORDEN con la rama izquierda del nodo}
Recorrido Postorden
regresar a POSTORDEN con NODO^.DER
{llamada recursiva a POSTORDEN con la rama derecha del nodo}
visitar el NODO {escribir NODO^.INFO}
Árboles Binarios de
Búsqueda
Árbol binario de búsqueda
Este tipo de árbol permite almacenar información
ordenada.
Reglas a cumplir:
Cada nodo del árbol puede tener 0, 1 ó 2 hijos.Cada nodo del árbol puede tener 0, 1 ó 2 hijos.
Los descendientes izquierdos deben tener un valor menor al
padre.
Los descendientes derechos deben tener un valor mayor al
padre.
Ejemplos de ABB…
13
21
33
21
30
33
5 18
15
25
40 36
32
¿Por qué
no
son ABB?
13
21
33
1
5
6
17 18
15
25
40 22
¿Por qué
no
son ABB?
13
21
33
1
5
6
17 18
15
25
40
22
Implementación de un ABB
struct nodo {
int llave;
struct nodo *izq; struct nodo *der; struct nodo *der; };
typedef struct nodo *ABBTree;
Insertar en un ABB
else {
insertar(arbol->izq,dato); }
} }
Reportar
void reportar(ABBTree abb, int h) {
if(abb!=NULL) {
printf("%i h=%i \n",abb->llave, h); reportar(abb->izq,h+1);
reportar(abb->der,h+1); }
}
Recorridos
void recorrerEnOrden(ABBTree abb) {
if(abb!=NULL) {
recorrerEnOrden(abb->izq); recorrerEnOrden(abb->izq); printf("%i \n",abb->llave); recorrerEnOrden(abb->der); }
}
Recorridos
void recorrerPreOrden(ABBTree abb) {
if(abb!=NULL) {
printf("%i \n",abb->llave); printf("%i \n",abb->llave);
recorrerEnOrden(abb->izq); recorrerEnOrden(abb->der); }
}
Recorridos
void recorrerPostOrden(ABBTree abb) {
if(abb!=NULL) {
recorrerEnOrden(abb->izq); recorrerEnOrden(abb->izq); recorrerEnOrden(abb->der); printf("%i \n",abb->llave); }
}
Buscar
int buscar(ABBTree abb, int dato) { int resp=0; if (abb==NULL) { resp=0; }