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