Estructuras de Datos y Algoritmos

Anuncio
Contenidos
•
•
•
•
Estructuras de Datos y Algoritmos
Tema 4. Árboles binarios
1
Árboles
Árboles binarios
Árboles binarios de búsqueda
Árboles AVL
Iván Cantador
David Vallet, José R. Dorronsoro
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Contenidos
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
2
Grafos. Definición
3
• Un grafo es una estructura de datos G = (V, R) compuesta
de:
•
•
•
•
Árboles
Árboles binarios
Árboles binarios de búsqueda
Árboles AVL
• Un conjunto V de vértices (nodos)
• Un conjunto R de ramas (arcos), conexiones entre los vértices
de V
• Ejemplo de grafo (dirigido)
3
2
6
4
1
5
• V= {1, 2, 3, 4, 5, 6}
• R= {(1,4), (1,5), (1,6), (2,3),…, (5,1), (6,2)}
• Un grafo es una EdD general, muy rica y flexible
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Grafos. Caminos
4
• Tiene un único nodo, denominado raíz, sin ramas incidentes
• Cada nodo ≠ raíz recibe una sola rama
• Cualquier nodo es accesible desde la raíz
• Ejemplo
3
4
2
3
Nodos
terminales
(hojas)
raíz
1
6
5
• Un árbol ordenado con raíz es un grafo tal que:
• Un camino de un grafo G = (V, R) es una secuencia de
nodos de V en los que cada nodo es adyacente al
siguiente mediante un arco de R
• Ejemplo
2
Árboles. Definición
7
1
5
4
6
• V= {1, 2, 3, 4, 5, 6}
• R= {(1,4), (1,5), (1,6), (2,3),…, (5,1), (6,2)}
• Caminos: {1, 6, 2, 3}, {5, 1, 4}, …
4
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
5
6
7
6
9
9
7
7
5
6
10
7
8
8
10
8
8
9
Árboles. Altura y profundidad
7
• La altura de un árbol es 1 más la longitud del camino
más largo que conecta la raíz a una hoja
• La profundidad (nivel) de un nodo es el número de
ramas entre el nodo y la raíz
10
• La profundidad de un árbol es el máximo número de ramas
entre la raíz una hoja del árbol (es -1 si el árbol está vacío)
• Ejemplo
1
T≡
2
4
3
5
6
9
7
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
10
8
Nodos
intermedios
6
3
9
7
9
1
2
5
6
• Un sub-árbol de un árbol T es un subconjunto de nodos
de T conectados mediante ramas de T
• Cada nodo de un árbol T junto con sus hijos da lugar a
nuevo sub-árbol T’
4
4
3
10
8
Árboles. Sub-árboles
3
2
5
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
2
1
8
10
altura(T) = 1 + 3 = 4
profundidad(1) = 0
profundidad(5) = 1
profundidad(7) = 3
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles. Árboles equilibrados
8
• Un árbol está equilibrado si para todo nodo el número
de niveles de sus sub-árboles no difieren en más de una
unidad
• Un árbol con máximo número k de hijos por nodo está
perfectamente equilibrado si todo nodo tiene k hijos
Árbol equilibrado
Contenidos
•
•
•
•
9
Árboles
Árboles binarios
Árboles binarios de búsqueda
Árboles AVL
Árbol perfectamente equilibrado
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Definición
10
• Un árbol binario (AB) es un árbol ordenado con raíz tal
que:
• cada nodo tiene a lo sumo 2 hijos
• Ejemplo
raíz
raíz
Árboles binarios. Definición
• En un AB:
• Todo nodo excepto el raíz tiene un nodo padre
• Todo nodo tiene a lo sumo 2 nodos hijos: hijo izquierdo e hijo
derecho
padre
de X
X
nodos
intermedios
hojas
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
hojas
hijo
izquierdo
de X
hijo
derecho
de X
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
11
Árboles binarios. Definición
12
• El hijo izquierdo de la raíz forma un nuevo árbol con dicho hijo
como raíz
• El hijo derecho de la raíz forma un nuevo árbol con el dicho
hijo como raíz
raíz
sub-árbol
derecho
raíz
sub-árbol
izquierdo
13
• Un árbol se puede recorrer de distintas formas, pero
siempre desde la raíz
• Para el recorrido normalmente se usa la propiedad
recursiva de los árboles
• Cuando se aplica un algoritmo de visita de árboles se
implementa la función "visitar" que puede realizar
distintas operaciones sobre cada nodo
• Propiedad recursiva de los AB
sub-árbol
izquierdo
Árboles binarios. Recorrido
sub-árbol
derecho
• Visitar un nodo puede ser p.e. imprimir el contenido del nodo
3
o liberar su memoria
1
6
2
7
5
4
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Recorrido
• Recorridos en profundidad
• preorden, postorden, inorden
• Ejemplo de aplicación (en grafos): encontrar componentes
conexas
• Recorrido en achura
• recorrido por nivel
• Ejemplos de aplicación (en grafos): camino más corto entre
dos nodos, crawling Web
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
14
Árboles binarios. Recorrido en profundidad: preorden
• Preorden = orden previo
• Desde la raíz y recursivamente:
1. Visitamos un nodo n
2. Recorremos en orden previo el hijo izquierdo de n
3. Recorremos en orden previo el hijo derecho de n
• Ejemplo
visitar = printf del contenido de un nodo
resultado: C A B F E D G
C
A
F
B
E
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
G
15
Árboles binarios. Recorrido en profundidad: preorden
16
• Algoritmo recursivo
• Postorden = orden posterior
• Desde la raíz y recursivamente:
• Caso base / condición de parada
• Caso general / llamada recursiva
• Pseudocódigo
abPrerden(ArbolBinario T) {
// árbol vacío
si abVacio(T) == TRUE
volver
else
visitar(T) // printf
abPreorden(izq(T))
abPreorden(der(T))
volver
}
Árboles binarios. Recorrido en profundidad: postorden 17
1. Recorremos en orden posterior el hijo izquierdo de n
2. Recorremos en orden posterior el hijo derecho de n
3. Visitamos un nodo n
3
1
• Ejemplo
6
2
7
5
visitar = printf del contenido de un nodo
resultado: B A D E G F C
4
A
• Observaciones
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Recorrido en profundidad: postorden 18
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Recorrido en profundidad: inorden
• Inorden = orden medio
• Desde la raíz y recursivamente:
• Pseudocódigo compacto
abPostorden(ArbolBinario T) {
// árbol no vacío
si abVacio(T) == FALSE:
si abVacio(izq(T)) == FALSE:
abPostorden(izq(T))
si abVacio(der(T)) == FALSE:
abPostorden(der(T))
visitar(T)
}
G
E
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
• Pseudocódigo más eficiente
F
B
• Árbol vacío ≡ no Nene nodos
• Árbol de un nodo ≡ un nodo raíz sin hijos
• Asociamos nodo ≡ raíz de un subárbol; úNl para la recursión
abPostorden(ArbolBinario T) {
// árbol no vacío
si abVacio(T) == FALSE:
abPostorden(izq(T))
abPostorden(der(T))
visitar(T)
}
C
1. Recorremos en orden posterior el hijo izquierdo de n
2. Visitamos un nodo n
3. Recorremos en orden posterior el hijo derecho de n
3
1
6
2
5
4
• Ejemplo
7
visitar = printf del contenido de un nodo
resultado: A B C D E F G
C
A
F
B
E
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
G
19
Árboles binarios. Recorrido en profundidad: inorden
20
21
• Recorrido en anchura = recorrido por nivel
• Algoritmo
• Pseudocódigo compacto
abInorden(ArbolBinario T) {
// árbol no vacío
si abVacio(T) == FALSE:
abInorden(izq(T))
visitar(T)
abInorden(der(T))
}
Árboles binarios. Recorrido en anchura
• Recorre de arriba abajo y de izquierda a derecha
• Nunca recorre un nodo de nivel i sin haber visitado los de nivel
i-1
• Implementación mediante el TAD Cola, sin recursividad
3
1
• Pseudocódigo más eficiente
abInorden(ArbolBinario T) {
// árbol no vacío
si abVacio(T) == FALSE:
si abVacio(izq(T)) == FALSE:
abInorden(izq(T))
visitar(T)
si abVacio(der(T)) == FALSE:
abInorden(der(T))
}
6
2
5
7
• Ejemplo
A
F
B
G
E
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Recorrido en anchura
C
resultado: C A F B E G D
4
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
22
Árboles binarios. Recorrido en anchura
23
• Ejemplo
• Pseudocódigo
• Recorre de arriba abajo y de izquierda a derecha
• Nunca recorre un nodo de nivel i sin haber visitado los de nivel
i -1
abAnchura(ArbolBinario T) {
colaInicializar(Q)
colaInsertar(Q, T)
mientras colaVacia(Q) == FALSE:
colaExtraer(Q, T’)
visitar(T’)
para cada hijo H de T’:
colaInsertar(Q, H)
}
abAnchura(ArbolBinario T) {
colaInicializar(Q)
colaInsertar(Q, T)
mientras colaVacia(Q) == FALSE:
colaExtraer(Q, T’)
visitar(T’)
para cada hijo H de T’:
colaInsertar(Q, H)
}
Q
C
C
A
F
B
E
G
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
VISITAR
C
AF
A
FB
F
BEG
B
EG
E
7D
G
D
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Árboles de expresión
24
Árboles binarios. Árboles de expresión
25
• Los sub-árboles de un AdE son AdE
• Un Árbol de Expresión (AdE) es un árbol binario donde:
operador
• Los nodos tienen operadores
• Las hojas tienen operandos
• (Todo nodo tiene 2 hijos, i.e. operador sobre dos valores)
AdE1
• Un AdE almacena una expresión (aritmética)
*
*
*
+
A
+
B
AdE2
C
A
/
D
B
C
C
D
E
(D/E)
(A+B) (C-(D/E))
E
((A+B)*(C–(D/E)))
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Árboles de expresión
• Recorrido en orden previo (preorden)
A
26
Árboles binarios. Árboles de expresión
27
*
+
• Construcción de un AdE
B
• Recorrido en orden posterior (postorden)
C
• El paso de una expresión infija a un AdE es natural
/
D
• Salida: A B + C D E / - *
• Forma posfijo/sufijo de la expresión
*
E
*
• “Imprimiendo” paréntesis al comienzo y al final de la llamada
a cada sub-árbol
• Salida: ((A + B) * (C – (D / E)))
• Forma infija de la expresión
(A + B)
((A + B) * (C – (D / E)))
(A + B) (C-(D / E))
*
• Recorrido en orden medio (inorden)
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
(A+B)
/
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
• Salida: * + A B – C / D E
• Forma prefijo de la expresión
*
-
+
A
B
/
C
D
E
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
C (D / E)
Árboles binarios. Árboles de expresión
28
Árboles binarios. Árboles de expresión
29
• Ejemplo 1: A B + C D E / - *
• Construcción de un AdE
Pila
Símbolo
• Basada en la evaluación de expresiones mediante el TAD Pila
• Consistente en la evaluación de una expresión guardando en
una pila árboles generados para sub-expresiones
A, B
A
B
+
+
• El algoritmo de evaluación más sencillo es el de
expresiones sufijo
A
B
+
C, D, E
• Si se tiene una expresión prefijo o infijo, ésta se pasa a sufijo
para evaluarla
- (A+B)*(C-D/E) a sufijo A B + C D E / - * evaluación
A
B
C
D
+
/
/
A
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
E
B
D
C
E
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Árboles de expresión
30
• Ejemplo 1: A B + C D E / - *
Árboles binarios. Árboles de expresión
31
• Ejemplo 2: (A + B – C) * (D ^ (E / F)) A B + C – D E F / ^ *
+
A
A
C
B
-
E
-, D, E, F, /
A
B
/
D
B
C
E
F
^
-
^
/
D
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
C
+
A
*
+
C
B
/
D
*
+
A, B, +, C
-
Pila
Símbolo
Pila
Símbolo
C
+
E
A
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
B
D
/
E
F
Árboles binarios. Árboles de expresión
32
Pila
typedef struct _NodoAB {
generic info;
struct _NodoAB *izq;
struct _NodoAB *der;
} NodoAB;
*
*
-
^
C D
+
A
33
• Estructura de datos de un nodo de un árbol binario
• Ejemplo 2: (A + B – C) * (D ^ (E / F)) A B + C – D E F / ^ *
Símbolo
Árboles binarios. Implementación en C
B
#define izq(pnodo) ((pnodo)->izq)
#define der(pnodo) ((pnodo)->der)
#define info(pnodo) ((pnodo)->info)
/
E
F
info
izq
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
der
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Implementación en C
34
Árboles binarios. Implementación en C
35
• Estructura de datos de un árbol binario
typedef NodoAB *ArbolBinario;
// Arbol es el puntero a nodo raíz
// Se puede aplicar izq(pnodo) y der(pnodo) a un tipo árbol
// ArbolBinario* es NodoAB**
3
arbolBinario
3
1
6
1
6
• Funciones de creación y liberación de un nodo de un
árbol binario
• NodoAB *abCrearNodo();
// Crea un nuevo nodo e inicializa sus campos
• status abLiberarNodo(NodoAB *pn);
// Libera la memoria de un nodo tras llamar a liberarInfo
5
5
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Implementación en C
36
NodoAB *abCrearNodo() {
NodoAB *pn = NULL;
pn = malloc(sizeof(NodoAB));
if (!pn) return NULL;
izq(pn) = der(pn) = NULL;
return OK;
}
• boolean abVacio(ArbolBinario *pa);
// Indica si un árbol está vacío
• status abInicializar(ArbolBinario *pa);
// Inicializa un árbol
• status abLiberar(ArbolBinario *pa);
// Libera la memoria de un árbol llamando a abLiberarNodo
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Implementación en C
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
38
status abInicializar(ArbolBinario *pa) {
if (pa == NULL) return ERROR;
*pa = NULL;
return OK;
}
status abLiberar(ArbolBinario *pa);
37
• Primitivas del TAD árbol binario
status abLiberarNodo(NodoAB *pn) {
if (!pn) return ERROR;
liberarInfo(info(pn));
free(pn);
pn = NULL;
return OK;
}
boolean abVacio(ArbolBinario *pa) {
if (*pa == NULL)
return TRUE;
else return FALSE;
}
Árboles binarios. Implementación en C
// Ojo: pa==NULL es ERROR
// Recorrido postorden
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Implementación en C
39
status abLiberar(ArbolBinario *pa) { // Versión con macros
if (!pa) return ERROR;
if (!abVacio(&izq(*pa)) {
abLiberar(&izq(*pa));
}
if (!abVacio(&der(*pa)) {
abLiberar(&der(*pa));
}
// visitar es liberar el nodo
abLiberarNodo(*pa);
return OK;
}
status abLiberar(ArbolBinario *pa) { // Versión sin macros
if (!pa) return ERROR;
if (!abVacio(&((*pa)->izq)) {
abLiberar(&((*pa)->izq));
}
if (!abVacio(&((*pa)->der)) {
abLiberar(&((*pa)->der));
}
// visitar es liberar el nodo
abLiberarNodo(*pa);
return OK;
}
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Profundidad
40
• Profundidad de un árbol
• T≡∅
25
4
43
• T ≡
profundidad(T)= 1
profundidad(T)= 3
(la mayor profundidad de todas
las hojas)
43
7
32
7
5
1= 21 – 1
4
25
3
22= 4
3 = 22 – 1
7 = 23 – 1
6
2
1
5
7
profundidad mínima necesaria para albergar n nodos:
p = prof(T) = ⌈log2(n + 1)) – 1⌉
29
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios. Profundidad
42
Contenidos
43
• AB casi completo
• Todos los niveles con profundidad d < p están completos, i.e.
tienen 2d nodos
• AB completo
• Todos los niveles con profundidad d ≤ p están completos, i.e.
tienen 2d nodos
• (casi completo y tiene exactamente 2p hojas a profundidad p)
no completo
4
3
3
1
21 = 2
• En total, un árbol de profundidad p completo puede albergar
(2p+1–1) nodos
43
12
6
2
1
25
20= 1
3
profundidad(T)= 0
• T ≡ 25
41
• Cada nivel de profundidad d de un AB puede albergar 2d nodos
profundidad(T)= -1
• T ≡ 25
Árboles binarios. Profundidad
2
casi
completo
completo
4
4
3
6
7
1
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
1
•
•
•
•
Árboles
Árboles binarios
Árboles binarios de búsqueda
Árboles AVL
6
2
5
7
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios de búsqueda. Definición
44
• Un Árbol Binario de Búsqueda (ABdB) es un árbol
binario T tal que ∀ sub-árbol T’ de T se cumple que
45
• Recorrido en orden medio de un ABdB
info(izq(T’)) < info(T’) < info(der(T’))
• Salida => 1 2 3 4 5 6 7
• ¡Listado ordenado de los nodos!
dado un criterio de ordenación de info(T)
3
3
1
6
2
1
7
5
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
46
• Creación de ABdB: inserción iterativa de valores en
ABdB parciales
• Ejemplo
25 43 12 7 32 29
25
25
25
43
12
12
43
7
25
25
43
12
32
43
12
7
Árboles binarios de búsqueda. Inserción
• La función inserta(T, d) que introduce un dato d en un
árbol T realiza lo siguiente:
• Si T está vacío, se crea un nodo con d y se inserta
• Si no, se hace una llamada recursiva a insertar
- Si d < info(a), entonces se ejecuta insertar (izq(T))
- Si d > info(a), entonces se ejecuta insertar (der(T))
- Caso excepcional: si dato d = info(T), se devuelve ERROR o
se ignora devolviendo OK
32
29
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
7
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios de búsqueda. Creación
43
5
4
• Cada subárbol de un ABdB es a su vez un ABdB
25
6
2
4
7
Árboles binarios de búsqueda. Orden medio
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
47
Árboles binarios de búsqueda. Inserción
48
Árboles binarios de búsqueda. Inserción
49
• Código C
• Pseudocódigo
status abdbInsertar(ArbolBinario T, dato d)
si abVacio(T)
// Caso base
T = abCrearNodo()
si (T == NULL) devolver ERROR
info(T) = d
devolver OK
// Caso general
else
si info(T) < d
devolver abdbInsertar(izq(T), d)
else
devolver abdbInsertar(der(t), d)
status abdbInsertar(ArbolBinario *pa, generic *d) {
if (pa == NULL) return ERROR;
if (abVacio(pa)) { // Caso base (condición de parada)
*pa = abCrearNodo();
if (*pa == NULL) return ERROR;
info(*pa) = *d;
return OK;
}
else {
// Caso general (llamada recursiva)
if (compararInfo(d, info(*pa)) < 0)
return abdbInsertar(&izq(*pa), d);
else
return abdbInsertar(&der(*pa), d);
}
}
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios de búsqueda. Creación y búsqueda50
• Dado un vector de valores representados en una lista, la
construcción de su correspondiente ABdB es como sigue:
status abdbCrear(ArbolBinario T, Lista L)
st = OK
mientras listaVacia(L) == FALSE && st == OK
listaExtraerInicio(L, d)
st = abdbInsertar(T, d)
si st == ERROR
abLiberar(T) // Ojo: la lista L no se ha recuperado
devolver st
• Una vez creado el ABdB
• Recorrer el árbol en orden medio recupera los datos ordenados
• Buscar un dato en el árbol es muy eficiente
- Buscar en una lista desordenada es menos eficiente, pues
hay que recorrerla de forma secuencial
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios de búsqueda. Búsqueda
• Búsqueda de un dato, e.g. 32
1: comparar(25, 32)?
25
2: comparar(43, 32)?
12
7
43
32 3: comparar(32, 32)!
29
• ¿Búsqueda de 33?
- Se hacen llamadas recursivas hasta llegar a un árbol vacío
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
51
Árboles binarios de búsqueda. Búsqueda
52
Árboles binarios de búsqueda. Complejidad búsqueda53
•
• Pseudocódigo
Coste (número de accesos/comparaciones) de buscar un
dato en un ABdB
• Para un ABdB (casi) completo con profundidad p:
Arbol abdbBuscar(ArbolBinario T, dato d)
si abVacio(T) == TRUE
devolver NULL
else si info(T) == d
devolver T
else si d < info(T)
devolver abdbBuscar(izq(T), d)
else
devolver abdbBuscar(der(T), d)
–
a lo sumo p accesos
• Para un ABdB (casi) completo de n nodos:
–
a lo sumo tantos accesos como la profundidad del árbol ≡ ⌈ log2(n + 1))–1⌉ ≡
Orden (log(n)) ≡ O(log(n))
Búsqueda secuencial en una lista
desordenada de n nodos,
a lo sumo n accesos: O(n)
• ¿Cuántas comparaciones en promedio se tienen que
hacer para encontrar un dato en un ABdB?
O(n)
O(log(n))
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árbolesbinariosdebúsqueda. Complejidad ordenación54
•
Árboles binarios de búsqueda. Extracción
Para n elementos, hay que realizar n inserciones
• Dado árbol (casi) completo, cada inserción es a lo sumo del orden de la
profundidad actual del árbol ≤ ⌈ log2(n + 1))–1⌉⌉ ≡ orden (log(n)) ≡ O(log(n))
• La creación del árbol es O(nlog(n)), pues involucra n inserciones de orden
O(log(n))
• Una vez creado el árbol, éste se puede usar para ordenar sus elementos
recorriéndolo por orden medio ≡ O(n) ordenación es O(nlog(n)) + O(n) ≡
O(nlog(n))
Ordenación de una lista de n
nodos mediante algoritmos como
BubbleSort, InsertSort: O(n2)
• Pseudocódigo
status abdbExtraer(ArbolBinario T, dato d)
si abVacio(T) == TRUE
devolver ERROR
T’ = abdbBuscar(T, d)
if T’ == NULL
devolver OK
else
devolver abdbReajustar(T’)
O(n2)
O(n*log(n))
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
55
Árboles binarios de búsqueda. Extracción
56
Árboles binarios de búsqueda. Extracción
57
• Reajuste de un (sub-)árbol T’ por la extracción de su raíz
1. La raíz de T’ es hoja: reajustar puntero del padre de (la raíz
de) T’ a NULL, eliminar T’
2. La raíz de T’ tiene 1 hijo
3. La raíz de T’ tiene 2 hijos
• Reajuste de un (sub-)árbol T’ por la extracción de su raíz
1. La raíz de T’ es hoja
2. La raíz de T’ tiene 1 hijo
3. La raíz de T’ tiene 2 hijos
Ejemplo: abdbExtraer(T, 2)
T
3
3
1
6
1
6
T’
2
7
5
4
4
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles binarios de búsqueda. Extracción
58
Árboles binarios de búsqueda. Extracción
• Reajuste de un (sub-)árbol T’ por la extracción de su raíz
1. La raíz de T’ es hoja
2. La raíz de T’ tiene 1 hijo
3. La raíz de T’ tiene 2 hijos: buscar “sucesor” de T’, guardar
info del sucesor en T’, extraer sucesor
1
6
2
5
2
5
4
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
3
3
1
6
7
4
T’
T
3
T’
El sucesor de T’ se obtiene:
1. Bajando a la derecha de T’ un nivel
2. Bajando a continuación a la izquierda
hasta el último nivel (nodo hoja)
Ejemplo: abdbExtraer(T, 3)
Ejemplo: abdbExtraer(T, 1)
3
7
59
• Reajuste de un (sub-)árbol T’ por la extracción de su raíz
1. La raíz de T’ es hoja
2. La raíz de T’ tiene 1 hijo: reajustar puntero del padre de T’ al
hijo de T’, eliminar de T’
3. La raíz de T’ tiene 2 hijos
T
7
5
6
2
5
4
4
1
7
6
2
5
4
1
7
sucesor de T’
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
6
2
5
7
Árboles binarios de búsqueda. Árboles no equilibrados60
Árboles binarios de búsqueda. Árboles no equilibrados61
• Problema de ABdB: árboles no equilibrados
L = {1,2,3,4,5,6}
abdbCrear(T, L)
1
2
3
• ¿Cómo crear ABdB equilibrados?
4
• Mediante el algoritmo AVL
5
6
• El acceso ya no es O(log(n)), sino O(n), por lo que:
• Coste de la búsqueda: O(nlog(n)) O(n)
• Coste de la ordenación: O(n) O(n2)
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Contenidos
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
62
Árboles AVL. Definición
63
• Factor de equilibrio de un árbol binario T
•
•
•
•
fe(T)=profundidad(izq(T))–profundidad(der(T))
Árboles
Árboles binarios
Árboles binarios de búsqueda
Árboles AVL
2
fe(1)=0
fe(2)=-2
1
5
fe(5)=1
4
6
fe(6)=0
fe(4)=1
fe(3)=0
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
3
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles AVL. Definición
64
Árboles AVL. Rotaciones
65
• El algoritmo AVL establece “rotaciones” de 2 nodos A y B en
un árbol binario para tratar ciertos “desequilibrios”
• Árbol AVL (Adelson-Velskii y Landis)
• Un árbol AVL es un ABdB* T en el que todo sub-árbol T’ cumple
que:
•
•
•
•
RI = rotación izquierda
RD = rotación derecha
RID = rotación izquierda + rotación derecha
RDI = rotación derecha + rotación izquierda
fe(A)
fe(T’)=0, fe(T’)=1 ó fe(T’)=-1
fe(B)
Rotación
-2
-2
• Proposición:
- Si T es un árbol AVL con N nodos, entonces:
profundidad(T) = O(log2N)
-2
-1
2
1
-2
1
A
B
2
1
B
A
RI(B)
-1
B
2
A
1
RD(B)
B
-1
A
B
A
B
-2 A
-2 A
B 1
A
A
B 1
RDI(izq(B))
B
* La definición de AVL se puede aplicar a cualquier árbol binario, pero en la asignatura se
usará con árboles binarios de búsqueda
2
-1
-1
RID(der(B))
B
-1
66
Árboles AVL. Construcción
0
1
Inserción de 2
-1
1
0
2
Inserción de 3
-2
0
1
2
-1
2
RI(2)
0
0
0
1
3
3
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
B
A
67
[1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8]
Inserción de 1
• Tras realizar una inserción de ABdB, se comprueba la condición
de AVL para realizar o no rotación
B
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
• Ejemplo: crear el árbol AVL para la lista
• Construcción de un AVL
A
A
B
B
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles AVL. Construcción
A 2
A 2
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Árboles AVL. Construcción
68
Árboles AVL. Construcción
• Ejemplo: crear el árbol AVL para la lista
• Ejemplo: crear el árbol AVL para la lista
[1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8]
[1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8]
-1
Inserción de 4
Inserción de 7
2
0
-1
1
3
69
-1
0
4
4
0
4
-2
2
0
0
5
0
1
3
0
RI(6)
-1
6
0
2
0
0
1
0
6
0
3
0
5
7
7
-1
Inserción de 15
-2
Inserción de 5
4
-1
2
0
2
0
-2
1
3
0
RI(4)
1
-1
4
0
4
0
3
0
-1
2
0
0
1
0
6
0
3
-1
5
7
5
0
15
5
-2
Inserción de 14
-2
4
Inserción de 6
-2
0
2
4
0
-1
1
4
0
-1
3
0
RI(4)
5
-1
2
0
0
5
0
1
3
-2
2
0
0
1
6
0
3
5
7
0
2
1
6
3
5
70
1
0
7
-1
4
6
0
0
1
14
-2
-2
2
0
3
5
13
0
4
7
-1
2
0
1
7
1
3
6
0
5
14
0
13
15
1
0
0
2
1
0
0
0
0
3
6
1
2
3
7
1
0
0
5
6
0
14
0
13
0
15
0
2
1
5
15
7
7
0
1
2
6
0 0
3
5
13
1
0
12
0
0
2
1
13
12
1
6
0 0
3
1
0
11
14
0
0
10
13
5
0
-1
0
7
7
0
2
1
4
0
0
12
1
2
6
0 0
3
15
0
1
2
-1
4
0
5
0
11
0
10
13
0
15
0
0
1
2
0
4
RD(10) 0
14
1
12
1
6
0 0
3
5
0
0
10
0
9
14
0 0
11
6
0 0
3
5
-1
0
0
12
0
11
13
0
1
2
1
4
0
15
0
7
0
14
-1
12
1
6
0 0
3
1
5
0
10
1
0
9
14
0 0
11
13
0
15
8
11
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
0
15
10
Inserción de 8
0
RD(12)
14
2
1
15
0
4
RD(12) 0
9
0
1
12
11
15
1
12
-1
2
4
0
0
0
0
0
1
6
0 0
3
0
14
1
12
Inserción de 11
0
0
0
5
0
14
0
0
15
71
7
2
4
0
0
13
5
15
-1
0
14
1
3
6
0
7
[1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8]
1
4
0
0
0
7
Inserción de 9
0
RI(7)
1
1
0
14
0
-2
0
0
-2
15
13
Inserción de 12
-1
14
Árboles AVL. Construcción
Inserción de 10
0
7
0
1
• Ejemplo: crear el árbol AVL para la lista
4
0
RDI(7)
1
7
-1
2
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
[1, 2, 3, 4, 5, 6, 7, 15, 14, 13, 12, 11, 10, 9, 8]
0
0
5
0
14
4
0
3
-2
0
• Ejemplo: crear el árbol AVL para la lista
-2
6
0
0
15
6
Árboles AVL. Construcción
0
0
1
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
-2
-2
2
0
1
4
0
RDI(14)
-2
6
Inserción de 13
-1
4
0
Estructura de Datos y Algoritmos
Escuela Politécnica Superior
Universidad Autónoma de Madrid
13
0
15
Estructuras de Datos y Algoritmos
Tema 4. Árboles binarios
Iván Cantador
David Vallet, José R. Dorronsoro
Escuela Politécnica Superior
Universidad Autónoma de Madrid
Descargar