Programación II Tema 5. Árboles binarios

Documentos relacionados
Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

DEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006

Tema Árboles generales. 9.2 Árboles binarios 9.3 Árboles de búsqueda

ELO320 Estructuras de Datos y Algoritmos. Arboles Binarios. Tomás Arredondo Vidal


Estructuras de datos: Árboles binarios de

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

7.4. UTILIDADES DE LAS PILAS

UNIDAD 9. DATOS COMPLEJOS PILAS

PRÁCTICA No. 13 ÁRBOL BINARIO DE BÚSQUEDA

Estructuras de datos. Estructuras de datos

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

El TAD Grafo. El TAD Grafo

<tipo> Tipo de dato de los elementos del vector

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Tema 6. Gestión dinámica de memoria

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Estructura de Datos. TDA: Listas. Primer Semestre, Indice. Tipos de estructura de datos lineales

Árboles binarios de búsqueda ( BST )

Árboles balanceados. Alonso Ramírez Manzanares Computación y Algoritmos Thursday, April 30, 15

Inteligencia Artificial

Árboles AVL. Laboratorio de Programación II

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Tema: Los Grafos y su importancia para la optimización de redes.

GRAMATICAS LIBRES DEL CONTEXTO

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

14. ÁRBOLES Fundamentos y terminología básica

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

EJERCICIOS DE ÁRBOLES BINARIOS

2.2 Nombres, Ligado y Ámbito

Arboles Binarios de Búsqueda

Curso de Java Introducción a la Programación III

Tabla de Símbolos. Programación II Margarita Álvarez

Árboles Binarios Ordenados Árboles AVL

(d) Puede haber estrategias que funcionan mejor que Minimax si el contrincante es

Máquinas Secuenciales, Autómatas y Lenguajes. Tema 3.1: Autómatas Finitos Deterministas

Es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre

Alonso Ramírez Manzanares Computación y Algoritmos 10.03

Clases e instancias. Algoritmos y Estructuras de Datos I. Clases e instancias. memoria dinámica.

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Procesadores de Lenguaje

(e) Con la poda alfa-beta se eliminan nodos que nunca serán alcanzados

árbol como un conjunto de nodos y líneas

ÁRBOLES BINARIOS GRUPO # 22 Alumnos: Aguilar Elba Barrios Miguel Camacho Yaquelin Ponce Rodríguez Jhonny

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Procesadores de lenguaje Tema 6 La tabla de símbolos

UNIVERSIDAD AUTONOMA DE BAJA CALIFORNIA DIRECCION GENERAL DE ASUNTOS ACADEMICOS PROGRAMA DE ASIGNATURA

Ampliación de Estructuras de Datos

Sistemas Operativos Practica 1: procesos y concurrencia.

Tablas Hash y árboles binarios

Autómatas Deterministas. Ivan Olmos Pineda

Algoritmos de Ordenación

Principios de Computadoras II

3. ESTRUCTURAS DE DATOS NO LINEALES

Árbol binario. Elaborado por Ricardo Cárdenas cruz Jeremías Martínez Guadarrama Que es un árbol Introducción

El Juego como Problema de Búsqueda

Clase 32: Árbol balanceado AVL

Práctica de constantes, expresiones y operadores. Programación en C 1

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

Capítulo 6. ÁRBOLES.

VI Colas de prioridad

ALGORITMO MINIMAX. o Nodo: Representa una situación del juego. o Sucesores de un nodo: Situaciones del juego a las que se

ORDENAMIENTO Y BÚSQUEDA EN ARREGLOS

11. PILAS Introducción Fundamentos

MODELOS DE COMPUTACION I Preguntas Tipo Test. 1. El lema de bombeo puede usarse para demostrar que un lenguaje determinado es regular.

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Teoría de grafos y optimización en redes

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Pilas y Colas. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Tema 10- Representación Jerárquica: Tema 10- Representación Jerárquica: Árboles Binarios

Algoritmos sobre Grafos

3. COLA DE PRIORIDAD DEFINICION (I)

Algoritmos glotones. mat-151

7. Agrupamiento (clustering)

Estructuras de Datos Dinámicas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos dinámicas

Un. VI. Generador de código intermedio.

Árboles de Búsqueda Binaria. Agustín J. González ELO-320: Estructura de Datos y Algoritmos

Introducción al lenguaje C

PROGRAMA DE ASIGNATURA DE PROGRAMACIÓN I

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos

Capítulo 12: Indexación y asociación

Fundamentos de Informática

Tema 5.- Recursividad

GUIA 2: Repaso sobre uso de C#. Funciones, métodos y arreglos.

TIPO DE DATO ABSTRACTO (TDA)

Algoritmos de Strings. Héctor Navarro

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

Notación Polaca (Jan Lukasiewitz) (Notación prefija)

El programa que permite el manejo de la base de datos tiene la siguiente funcionalidad:

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Fundamentos de Programación Visual Basic

TAD: Pila. TALLER: TAD Pila

Tema: Métodos de Ordenamiento. Parte 1.

Estructuras de datos: Pilas, Colas, Listas

Ing. Manuel Ramírez López ITESCA

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

Árboles binarios de búsqueda

Semana de las Matemáticas e Ingeniería. Desarrollo de algoritmos recursivos empleando la aplicación PseInt

Transcripción:

ontenidos Programación II Tema 5. Árboles binarios Iván antador ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción ontenidos ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción 2 Grafos. efinición Un grafo es una estructura de datos G=(V, R) compuesta de: Un conjunto V de vértices(nodos) Un conjunto R de ramas(arcos), conexiones entre los vértices de V de grafo (dirigido) V= {, 2,,, 5, 2 R= {(,), (,5), (,), (2,),, (5,), (,2) Un grafo es una Edgeneral, muy rica y flexible 5

Grafos. Ejemplos (I) Máquinas de estados (autómatas finitos deterministas) Grafos. Ejemplos (II) Planificación de tareas Grafos. Ejemplos (III) Redes de transporte 5 Grafos. Ejemplos (IV) 7 Redes sociales

Grafos. Ejemplos (V) 8 Grafos. aminos 9 Internet redes de ordenadores 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 2 5 V= {, 2,,, 5, R= {(,), (,5), (,), (2,),, (5,), (,2) aminos: {,, 2,, {5,,, Árboles. efinición 0 Árboles. Sub-árboles Un árbol ordenado con raíz es un grafo tal que: Un sub-árbol de un árbol T es un subconjunto de nodos de T conectados mediante ramas de T ada nodo de un árbol T junto con sus hijos da lugar a nuevo sub-árbol T 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 2 raíz nodos terminales (hojas) 7 raíz 2 nodos intermedios árbol T sub-árboles T 2 5 2 5 7 9 7 9 0 8 5 8 9 0 9 7 0 7 0 8 8 nodos terminales (hojas) nodos intermedios 7 5 8 8 9 0

Árboles. Nodos padre e hijo 2 Árboles. Profundidad En un árbol =(V, R): Un nodo u ϵv es padrede otro nodo v ϵvsi existe un arco r = (u, v) ϵr Un nodo v ϵv es hijode otro nodo u ϵv si existe un arco r = (u, v) ϵr T es padre de 7 y 8 2 5 9 7 8 0 es hijo de (la raíz) no tiene padre 2 (una hoja) no tiene hijos La profundidad (nivel) de un nodo es el número de ramas entre el nodo y la raíz (es 0 para la raíz) La profundidad (altura) de un árbol es el máximo número de ramas entre la raíz una hoja del árbol (es - si el árbol está vacío, 0 para un árbol con un nodo) T profundidad(t) = 2 5 9 7 8 0 profundidad() = 0 profundidad(5) = profundidad(7) = Árboles. Profundidad Profundidad de un árbol T profundidad(t)= - 25 T 25 profundidad(t)= 0 T 25 25 profundidad(t)= T 25 profundidad(t)= 2 7 2 29 (la mayor profundidad de todas las hojas) ontenidos ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción 5

Árboles binarios. efinición Árboles binarios. efinición 7 Un árbol binario(b) es un árbol ordenado con raíz tal que: cada nodo tiene a lo sumo2 hijos raíz raíz En un B: 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 nodos intermedios hojas hojas hijo izquierdo de X X hijo derecho de X Árboles binarios. efinición Propiedad recursiva de los B El hijo izquierdo de la raíz (u otro nodo) forma un nuevo árbol con dicho hijo como raíz El hijo derecho de la raíz (u otro nodo) forma un nuevo árbol con dicho hijo como raíz sub-árbol izquierdo raíz sub-árbol derecho sub-árbol izquierdo raíz sub-árbol derecho 8 ontenidos ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción 9

Árboles binarios. Recorrido 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 uando se aplica un algoritmo de visita de árboles se implementa la función "visitar" que puede realizar distintas operaciones sobre cada nodo Visitar un nodo puede ser p.e.imprimir el contenido del nodo o liberar su memoria 2 5 7 20 Árboles binarios. Recorrido s en profundidad preorden, postorden, inorden de aplicación (en grafos): encontrar componentes conexas en anchura recorrido por nivel s de aplicación (en grafos): camino más corto entre dos nodos, crawling Web 2 Árboles binarios. Recorrido en profundidad: preorden Preorden = orden previo esde la raíz y recursivamente:. Visitamos nodo actual n 2. Recorremos en orden previo el hijo izquierdo de nodo actual n. Recorremos en orden previo el hijo derecho de nodo actual n visitar = printfdel contenido de un nodo resultado: B F E G F B E G 22 Árboles binarios. Recorrido en profundidad: preorden lgoritmo recursivo aso base / condición de parada aso general / llamada recursiva Pseudocódigo ab_preorden(rbolbinario T) { // Árbol vacío si ab_vacio(t)= TRUE: volver si no: nodoab_visitar(t) // printf ab_preorden(izq(t)) ab_preorden(der(t)) volver Observaciones Árbol vacío no ene nodos Árbol de un nodo un nodo raíz sin hijos sociamos nodo raíz de un subárbol; ú l para la recursión 2 5 7 2

Árboles binarios. Recorrido en profundidad: postorden Postorden = orden posterior esde la raíz y recursivamente:. Recorremos en orden posterior el hijo izquierdo de nodo actual n 2. Recorremos en orden posterior el hijo derecho de nodo actual n. Visitamos nodo actual n visitar = printfdel contenido de un nodo resultado: B E G F F B E G 2 Árboles binarios. Recorrido en profundidad: postorden Pseudocódigo compacto ab_postorden(rbolbinario T) { // Árbol no vacío si ab_vacio(t) = FLSE: ab_postorden(izq(t)) ab_postorden(der(t)) nodoab_visitar(t) Pseudocódigo más eficiente ab_postorden(rbolbinario T) { // Árbol no vacío si ab_vacio(t) = FLSE: si ab_vacio(izq(t)) = FLSE: ab_postorden(izq(t)) si ab_vacio(der(t)) = FLSE: ab_postorden(der(t)) nodoab_visitar(t) 2 5 7 25 Árboles binarios. Recorrido en profundidad: inorden 2 Árboles binarios. Recorrido en profundidad: inorden 27 Inorden= orden medio esde la raíz y recursivamente:. Recorremos en orden posterior el hijo izquierdo de nodo actual n 2. Visitamos nodo actual n. Recorremos en orden posterior el hijo derecho de nodo actual n visitar = printfdel contenido de un nodo resultado: B E F G F B E G Pseudocódigo compacto ab_inorden(rbolbinario T) { // Árbol no vacío si ab_vacio(t) = FLSE: ab_inorden(izq(t)) nodoab_visitar(t) ab_inorden(der(t)) Pseudocódigo más eficiente ab_inorden(rbolbinario T) { // Árbol no vacío si ab_vacio(t) = FLSE: si ab_vacio(izq(t)) = FLSE: ab_inorden(izq(t)) nodoab_visitar(t) si ab_vacio(der(t)) = FLSE: ab_inorden(der(t)) 2 5 7

Árboles binarios. Recorrido en anchura en anchura = recorrido por nivel lgoritmo Recorre de izquierda a derecha y de arriba a abajo Nunca recorre un nodo de nivel isin haber visitado todos los de nivel i- Implementación mediante el T ola, sin recursividad resultado: F B E G F B E G 28 Árboles binarios. Recorrido en anchura Pseudocódigo Recorre de arriba abajo y de izquierda a derecha Nunca recorre un nodo de nivel isin haber visitado los de nivel i- ab_anchura(rbolbinario T) { Q = cola_crear() cola_insertar(q, T) mientras cola_vacia(q) = FLSE: T = cola_extraer(q) nodoab_visitar(t ) para cada hijo H de T : cola_insertar(q, H) cola_liberar(q) 29 Árboles binarios. Recorrido en anchura 0 ontenidos ab_anchura(rbolbinario T) { Q = cola_crear() cola_insertar(q, T) mientras cola_vacia(q) = FLSE: T = cola_extraer(q) nodoab_visitar(t ) para cada hijo H de T : cola_insertar(q, H) cola_liberar(q) F B E G VISITR F B E G F F B B E G E G 7 Q ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción

Árboles binarios. ompletitud ada nivel de profundidad dde un B puede albergar 2 d nodos 2 0 = 2 = 2 2 5 7 2 2 = En total, un árbol de profundidad pcompleto puede albergar (2 p+ )nodos profundidad mínima necesaria para albergar N nodos: = 2 7 = 2 2 5 7 p = prof(t) = log 2 (N + )) = 2 2 2 Árboles binarios. ompletitud B casi completo Todos los niveles con profundidad d < p están completos, i.e. tienen 2 d nodos B completo Todos los niveles con profundidad d p están completos, i.e. tienen 2 d nodos (= casi completo y tiene exactamente 2 p hojas a profundidad p) no completo 2 casi completo 7 completo 2 5 7 ontenidos Árboles binarios. Implementación en 5 ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción Estructura de datos de un nodo de un árbol binario // En arbolbinario.c #define info(pnodo) ((pnodo)->info) #define izq(pnodo) ((pnodo)->izq) #define der(pnodo) ((pnodo)->der) struct _NodoB { Elemento info; struct _NodoB izq; struct _NodoB der; ; typedef struct _NodoB NodoB; izq info der

Árboles binarios. Implementación en Estructura de datos de un árbol binario // En arbolbinario.c #define root(pab) ((pab)->root) struct _rbolbinario { NodoB root; // un árbol es el puntero a su nodo raíz ; // En arbolbinario.h typedef struct _rbolbinario rbolbinario; root Árboles binarios. Implementación en Funciones de creación y liberación de un nodo de un árbol binario NodoB nodoab_crear(); // rea un nuevo nodo e inicializa sus campos a NULL void nodoab_liberar(nodob pn); // Libera memoria de un nodo tras llamar a elemento_liberar 7 5 5 Árboles binarios. Implementación en 8 Árboles binarios. Implementación en 9 // La inicialización de info se hará tras la llamada a nodoab_crear NodoB nodoab_crear() { NodoB pn = NULL; pn = (NodoB ) malloc(sizeof(nodob)); if (!pn) return NULL; info(pn) = izq(pn) = der(pn) = NULL; Primitivas del T árbol binario rbolbinario ab_crear(); // Reserva memoria e inicializa un árbol return pn; boolean ab_vacio(rbolbinario pa); // Indica si un árbol tiene algún nodo o no void nodoab_liberar(nodob pn) { if (pn) { elemento_liberar(info(pn)); free(pn); void ab_liberar(rbolbinario pa); // Libera la memoria de un árbol y todos sus nodos

Árboles binarios. Implementación en struct _rbolbinario { NodoB root; ; 0 Árboles binarios. Implementación en struct _rbolbinario { NodoB root; ; rbolbinario ab_crear() { rbolbinario pa = NULL; pa = (rbolbinario ) malloc(sizeof(rbolbinario)); if (!pa) return NULL; root(pa) = NULL; rbolbinario ab_crear() { rbolbinario pa = NULL; pa = (rbolbinario ) malloc(sizeof(rbolbinario)); if (!pa) return NULL; root(pa) = NULL; return pa; return pa; Árboles binarios. Implementación en struct _rbolbinario { NodoB root; ; 2 Árboles binarios. Implementación en struct _rbolbinario { NodoB root; ; boolean ab_vacio(rbolbinario pa) { if (!pa) { return TRUE; boolean ab_vacio(rbolbinario pa) { if (!pa) { return TRUE; if (!root(pa)) { return TRUE; return FLSE; if (!root(pa)) { return TRUE; return FLSE;

5 Árboles binarios. Implementación en Árboles binarios. Implementación en Implementar la función ab_liberar La liberación de un árbol se realiza usando la propiedad de recursión El hijo izquierdo de un nodo forma un nuevo árbol con dicho hijo como raíz El hijo derecho de un nodo forma un nuevo árbol con dicho hijo como raíz Para liberar un árbol desde su raíz: primero se libera el árbol del hijo izquierdo y el árbol hijo derecho, y luego se libera la raíz Esquema de liberación: recorrido postordende árbol T considerando como visita de un nodo su liberación ab_liberar(t) { ab_liberar(izq(t)) ab_liberar(der(t)) liberar(root(t)) // visita de la raíz = liberación de la raíz Árboles binarios. Implementación en Árboles binarios. Implementación en 7 // Función públicamente declarada en arbolbinario.h void ab_liberar(rbolbinario pa) { if (!pa) return; // Función públicamente declarada en arbolbinario.h void ab_liberar(rbolbinario pa) { if (!pa) return; ab_liberar_rec(root(pa)); // Primera llamada: root ab_liberar_rec(root(pa)); // Primera llamada: root free(pa); free(pa); // Función privada en arbolbinario.c void ab_liberar_rec(nodob pn) { if (!pn) return; // Función privada en arbolbinario.c void ab_liberar_rec(nodob pn) { if (!pn) return; if (izq(pn)) { ab_liberar_rec(izq(pn)); if (der(pn)) { ab_liberar_rec(der(pn)); nodoab_liberar(pn); // Liberación de subárbol izquierdo // Liberación de subárbol derecho // visitar nodo = liberar nodo if (izq(pn)) { ab_liberar_rec(izq(pn)); if (der(pn)) { ab_liberar_rec(der(pn)); nodoab_liberar(pn); // Liberación de subárbol izquierdo // Liberación de subárbol derecho // visitar nodo = liberar nodo

Árboles binarios. Implementación en uál sería la implementación de primitivas para insertar y extraer elementos de un árbol binario? La respuesta se abordará a continuación al estudiar los árboles binarios de búsqueda 8 ontenidos ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción 9 Árbolesbinariosdebúsqueda. efinición Un Árbol Binario de Búsqueda (BdB) es un árbol binario T tal que sub-árbol T de T se cumple que info(izq(t )) < info(t ) < info(der(t )) dado un criterio de ordenación para los info(t), que vendrá dado por una primitiva elemento_comparar(e,e ) del T Elemento Nota: ada subárbol de un BdBes a su vez un BdB 2 5 7 50 Árbolesbinariosdebúsqueda. Orden medio en orden mediode un BdB Salida 2 5 7 Listado ordenado de los nodos! 2 5 7 5

ontenidos 52 Árbolesbinariosdebúsqueda. reación 5 ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción reación de BdB: inserción iterativa de valores en BdB parciales 25 25 2 25 2 7 2 29 25 7 2 2 25 7 2 2 25 7 2 29 25 5 55 Árbolesbinariosdebúsqueda. Inserción Árbolesbinariosdebúsqueda. Inserción La función abdb_insertar(t,e) que introduce un dato e en un árbol Trealiza lo siguiente: Si Testá vacío, se crea un nodo con ey se inserta Si no, se hace una llamada recursiva a insertar - Si e < info(t), entonces se ejecuta insertar (izq(t)) - Si e > info(t), entonces se ejecuta insertar (der(t)) - aso excepcional: si dato e= info(t), se devuelve ERROR o se ignora devolviendo OK Pseudocódigo status abdb_insertar(rbolbinario T, Elemento e) si ab_vacio(t) // aso base T = nodoab_crear() si (T == NULL) devolver ERROR info(t) = e devolver OK else // aso general si info(t) < e devolver abdb_insertar(izq(t), d) else devolver abdb_insertar(der(t), d)

Árbolesbinariosdebúsqueda. Inserción status abdb_insertar(rbolbinario pa, Elemento pe) { if (!pa!pe) return ERROR; return abdb_insertar_rec(&root(pa), pe); // Función pública status abdb_insertar_rec(nodob ppn, Elemento pe) { // Función privada int cmp; if (!ppn) { ppn = nodoab_crear(pe); if (!ppn) return ERROR; // Ojo: crea nodo con copia de pe en info cmp = elemento_comparar(pe, info(ppn)); if (cmp < 0) { return abdb_insertar_rec(&izq(ppn), pe); if (cmp > 0) { return abdb_insertar_rec(&der(ppn), pe); if (cmp == 0) { return OK; // El elemento ya estaba en el árbol: se podría devolver ERROR return OK; 5 Árbolesbinariosdebúsqueda. reación y búsqueda ado un vector de valores representados en una lista,la construcción de su correspondiente BdB es como sigue: status abdb_crear(rbolbinario T, Lista L) mientras lista_vacia(l) == FLSE && st == OK e = lista_extraerini(l) st = abdb_insertar(t, e) si st == ERROR ab_liberar(t) // Ojo: la lista L no se ha recuperado devolver ERROR devolver OK Una vez creado el BdB 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 57 Árbolesbinariosdebúsqueda. Búsqueda 58 Árbolesbinariosdebúsqueda. Búsqueda 59 Búsqueda de un dato, p.e. 2 : comparar(2, 25)? 25 2: comparar(2, )? 2 7 2 : comparar(2, 2)! 29 Pseudocódigo rbol abdb_buscar(rbolbinario T, Elemento e) si ab_vacio(t) == TRUE devolver NULL else si info(t) == e devolver T else si e < info(t) devolver abdb_buscar(izq(t), e) else devolver abdb_buscar(der(t), e) Búsqueda de? - Se hacen llamadas recursivas hasta llegar a un árbol vacío uántas comparaciones en promedio se tienen que hacer para encontrar un dato en un BdB?

Árbolesbinariosdebúsqueda.omplejidad búsqueda oste(número de accesos/comparaciones) de buscar un dato en un BdB Para un BdB(casi) completo con profundidad p: a lo sumo p accesos Para un BdB(casi) completo de nnodos: a lo sumo tantos accesos como la profundidad del árbol log 2 (n + )) Orden (log(n)) O(log(n)) Búsqueda secuencial en una lista desordenada de nnodos, a lo sumo naccesos: O(n) 0 Árbolesbinariosdebúsqueda.omplejidad ordenación Para n elementos, hay que realizar n inserciones ado árbol (casi) completo, cada inserción es a lo sumo del orden de la profundidad actual del árbol log2(n + )) orden (log(n)) O(log(n)) La creación del árbol es O(n log(n)), pues involucra ninserciones 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(n log(n)) + O(n) O(n log(n)) Ordenación de una lista de n nodos mediante algoritmos como BubbleSort, InsertSort: O(n 2 ) O(n) O(log(n)) O(n 2 ) O(nlog(n)) ontenidos ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción 2 Árbolesbinariosdebúsqueda. Extracción Pseudocódigo status abdb_extraer(rbolbinario T, Elemento e) si ab_vacio(t) == TRUE devolver ERROR T = abdb_buscar(t, e) // Buscar devuelve el nodo donde está e if T == NULL devolver OK else devolver abdb_reajustar(t )

Árbolesbinariosdebúsqueda. Extracción Reajustede un (sub-)árbol T por la extracción de su raíz. La raíz de T es hoja 2. La raíz de T tiene hijo. La raíz de T tiene 2 hijos Árbolesbinariosdebúsqueda. Extracción Reajustede un (sub-)árbol T por la extracción de su raíz. 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 hijo. La raíz de T tiene 2 hijos Ejemplo: abdb_extraer(t, 2) T 5 T 2 5 7 5 7 Árbolesbinariosdebúsqueda. Extracción Reajustede un (sub-)árbol T por la extracción de su raíz. La raíz de T es hoja 2. La raíz de T tiene hijo: reajustar puntero del padre de T al hijo de T, eliminar de T. La raíz de T tiene 2 hijos Árbolesbinariosdebúsqueda. Extracción Reajustede un (sub-)árbol T por la extracción de su raíz. La raíz de T es hoja 2. La raíz de T tiene hijo. La raíz de T tiene 2 hijos: buscar sucesor de T, guardar info del sucesor en T, extraer sucesor 7 Ejemplo: abdb_extraer(t, ) T T 2 T Ejemplo: abdb_extraer(t, ) T El sucesor de T se obtiene:. Bajando a la derecha de T un nivel 2. Bajando a continuación a la izquierda hasta el último nivel (nodo hoja) 2 5 7 5 7 2 5 7 2 5 7 2 5 7 sucesor de T

ontenidos 8 Árbolesbinariosdebúsqueda. Equilibrado 9 ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción Problema de BdB: árboles no equilibrados L = {,2,,,5, abdbrear(t, L) El acceso ya no es O(log(n)), sino O(n), por lo que: oste de la búsqueda: O(n log(n)) O(n) oste de la ordenación: O(n) O(n 2 ) 2 5 Árbolesbinariosdebúsqueda. Equilibrado 70 Árbolesbinariosdebúsqueda. Equilibrado 7 Un árbol está equilibradosi 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 ómo crear BdB equilibrados? Mediante el algoritmo VL (se estudiará en otra asignatura) Árbol equilibrado Árbol perfectamente equilibrado

ontenidos ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción 72 Árboles de expresión. efinición Un Árbol de Expresión(dE) es un árbol binario donde: Los nodos tienen operadores Las hojas tienen operandos (Todo nodo tiene 2 hijos, i.e., operador sobre dos valores) + - B / E 7 Árboles de expresión. efinición Los sub-árboles (de más de un nodo) de un deson de operador de de 2 Un de almacena una expresión aritmética + - (+B) - B / (+B) (-(/E)) (/E) E ((+B)( (/E))) 7 Árboles de expresión. Recorrido en orden previo (preorden) Salida: + B / E Forma prefijo de la expresión en orden posterior (postorden) Salida: B + E / - Forma postfijo de la expresión en orden medio (inorden) Imprimiendo paréntesis al comienzo y al final de la llamada a cada sub-árbol Salida: (( + B) ( ( / E))) Forma infijo de la expresión + - B / 75 E

ontenidos 7 Árboles de expresión. onstrucción 77 onstrucción de un de ompletitud de búsqueda onstrucción de un árbol e inserción y búsqueda de un elemento y recorrido onstrucción El paso de una expresión infija a un dees natural a ojo : (( + B) ( ( / E))) ( + B) - ( + B) (-( / E)) ( / E) + - B / E 78 79 Árboles de expresión. onstrucción Árboles de expresión. onstrucción onstrucción de un de Basada en la evaluación de expresiones mediante el T Pila onsistente en la evaluación de una expresión guardando en una pila árboles generados para sub-expresiones El algoritmo de evaluación más sencillo es el de expresiones postfijo : B + E / - Símbolo, B + Pila B + B Si se tiene una expresión prefijo o infijo, ésta se pasa a postfijo para evaluarla,, E + B E - (+B)(-/E) a postfijo B + E / - evaluación / + B / E

Árboles de expresión. onstrucción 80 Árboles de expresión. onstrucción 8 : B + E / - Símbolo Pila 2: ( + B ) ( ^ (E / F)) B + E F / ^ Símbolo Pila - + B - / E, B, +, + -,, E, F, / + B - / B E F + - B / ^ + - ^ / E B E F Árboles de expresión. onstrucción 82 2: ( + B ) ( ^ (E / F)) B + E F / ^ Símbolo Pila - ^ + / B E F