Árboles generales. Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva:

Documentos relacionados
Tema Árboles binarios fmap para árboles binarios Plegado de árboles binarios

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

Tema 6. Definiciones de tipos

Programación Declarativa Haskell Informática Sistemas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Análisis y Complejidad de Algoritmos. Arboles Binarios. Arturo Díaz Pérez

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga. Tema 8. Listas

Tema 1. Tema 2. Informática Haskell Matemáticas Curso Pepe Gallardo Universidad de Málaga

El sistema de clases de Haskell. Introducción

Programación Estructuras Arborescentes

Tema 7. El sistema de clases

Introducción a los árboles. Lección 11

Estructura de datos y de la información Boletín de problemas - Tema 10

Tipos de datos algebraicos

Árboles y esquemas algorítmicos. Tema III

Estructura de Datos Unidad 6: ARBOLES

1.1 Define un operador ( ) que devuelva True si y solo si tan solo uno de sus argumentos es True. Por ejemplo:? (3 > 2) (2 > 5)

Tema: Arboles en C#. Objetivos Específicos. Materiales y Equipo. Introducción Teórica. Definición de Árbol Binario. Programación IV. Guía No.

Programación Declarativa UNIVERSIDAD DE MÁLAGA

Tema 9: Declaraciones de tipos y clases

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

El TAD Árbol. El TAD Árbol

Tema 9: Declaraciones de tipos y clases

Tema 6: Estructuras de datos recursivas

Ejercicio 2 Considere la representación para Lista de Naturales y Árbol Binario de Naturales de la Figura 1.

Arboles Binarios de Búsqueda en C++

Tipos paramétricos y recursivos

Tema 10: Árbol binario de búsqueda

Algoritmos y Programación II Curso 2006

Un árbol binario T se define como un conjunto finito de elementos, llamados nodos, de forma que:

Estructuras de Datos y Algoritmos

Tema 14: ÁRBOLES Algoritmos y estructuras de datos I - Tema 14 1

Estructuras de datos utilizando JAVA

TEMA 3. Árboles. Objetivos. Contenidos. Bibliografía. Básica

ÁRBOLES CRISTIAN ALFREDO MUÑOZ ÁLVAREZ JUAN DAVID LONDOÑO CASTRO JUAN PABLO CHACÓN PEÑA EDUARDO GONZALES

Árboles Binarios Ordenados Árboles AVL

ESTRUCTURA DE DATOS. ABB Arboles de Búsqueda Binaria

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Divisibilidad y congruencia

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

ESTRUCTURAS DE DATOS Y ALGORITMOS

Estructuras de datos: Árboles binarios de

Tema 21: Algoritmos de exploración de grafos

El método main de la clase PruebaArbol, empieza creando una instancia de un objeto Árbol vacío y asigna su referencia a la variable árbol

ÁRBOL BINARIO. T der. Árbol binario homogéneo es aquel cuyos nodos tienen grado 0 ó 2(no hay ninguno de grado 1).

Para la resolución de los ejercicios, se dispone de una implementación de árbol binario a través de la clase BinTree con la siguiente especificación.

Guía 2: Listas, recursión e inducción

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

EDA. Tema 8 Colas de Prioridad: Heaps

Manos a la obra: Recursión, división y listas

PRÁCTICA No. 9 RECORRIDOS EN ÁRBOLES BINARIOS

Definiciones de tipo. Sinónimos de tipo

Colas deprioridad y heaps

Tema 6: Funciones recursivas

Instituto de Computación. Facultad de Ingeniería. Universidad de la República Examen de Programación 2 03 de Agosto de 2006 Generalidades:

Árboles binarios. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile

Francisco J. Hernández López

Guía 2: Funciones, listas, recursión e inducción

Tema 13: Aplicaciones de programación funcional

Programación Declarativa UNIVERSIDAD DE MÁLAGA

Segundo parcial de Programación 2

Clase adicional 9. Listas enlazadas. Temas. Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño

LECCION N 08 ARBOLES. Un árbol es un grafo A que tiene un único nodo llamado raíz que:

Tema 10. Árboles. José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía

Estructura de datos y algoritmos. Tema V TDA DINÁMICOS NO LINEALES: Árboles: árboles binarios

12/08/2017 AVL. Especificación sobre árboles AVL. AVL: rotaciones

Pattern matching + Tipos enumerados

Definición recursiva de los árboles

Definición 1: Un grafo G es una terna ordenada (V(G), E(G), Ψ

Temario. Tema 5. Estructuras de Datos no Lineales. 5.1 Árboles Binarios 5.2 Árboles n-arios

Tema 08: TAD Árbol. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Lenguajes de Programación

Capítulo 8. Árboles. Continuar

Definiciones: conjuntos, grafos, y árboles. Agustín J. González ELO 320: Estructura de Datos y Algoritmos. 2002

Introducción a la Programación Genérica

Listas Posicionales. Listas posicionales

Polinomios. Taller de Álgebra I. Segundo cuatrimestre de 2013

Tema 3: Tipos y clases

Tema 3: Tipos y clases

Programación Funcional

Tema 3: Tipos y clases

Algoritmos y estructuras de datos

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Árboles balanceados (AVL) Tablas de dispersión (Hash) Colas de prioridad (Heap)

Tema 7: Árbol Binario

Definición: NODO Un nodo es un punto de intersección o unión de varios elementos que confluyen en el mismo lugar.

Tema 3: Tipos y clases

Estructuras de Datos II

Números primos en Haskell

Ejercicios del Tema 3 Estructuras jerárquicas: Árboles

data Tree a = Tip Node a (Tree a) (Tree a) deriving Show

1. Leer el primer número y almacenarlo en la raíz del árbol. 2. Repetir hasta encontrar un duplicado o el árbol esté vacío.

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

Programación Funcional Haskell Clase 22

Tema 3. Patrones y Definiciones de Funciones

Programación Funcional en Haskell

Árboles n-arios de búsqueda. Lección 16

Estructuras de datos: Conjuntos disjuntos

Árboles n-arios. Lección 15

Estructuras de datos. Estructuras de datos

Transcripción:

Capítulo 9. Programación con Árboles 107 Árboles Árboles generales Un árbol es una estructura no lineal acíclica utilizada para organizar información de forma eficiente. La definición es recursiva: Un árbol es una colección de valores {v 1, v 2,... v n } tales que Si n = 0 el árbol se dice vacío. En otro caso, existe un valor destacado que se denomina raíz (p.e. v 1 ), y los demás elementos forman parte de colecciones disjuntas que a su vez son árboles. Estos árboles se llaman subárboles del raíz. 10 22 35 52 15 12 33

Capítulo 9. Programación con Árboles 108 Representación en Haskell 10 22 35 52 15 12 33 data Árbol a = Vacío Nodo Show a }{{} raíz [Árbol a] }{{} hijos deriving a1 :: Árbol Integer a1 = Nodo 10 [a11, a12, a13] a11 = Nodo 22 [hoja 15, hoja 12] a12 = hoja 35 a13 = Nodo 52 [hoja 33] hoja :: a Árbol a hoja x = Nodo x [ ] profundidad :: Árbol a Integer profundidad Vacío = 0 profundidad (Nodo [ ]) = 1 profundidad (Nodo xs) = (+1). maximum. map profundidad $ xs raíz :: Árbol a a raíz Vacío = error raíz de árbol vacío raíz (Nodo x ) = x tamaño :: Árbol a Integer tamaño Vacío = 0 tamaño (Nodo xs) = (+1). sum. map tamaño $ xs

Capítulo 9. Programación con Árboles 109 Árboles binarios Un árbol binario es árbol tal que cada nodo tiene como máximo dos subárboles. 24 15 10 18 27 24 dataárbolb a = VacíoB NodoB (ÁrbolB a) }{{} sub izq a }{{} raíz (ÁrbolB a) }{{} sub der deriving Show Consideraremos que las tres componentes del constructor NodoB son el subárbol izquierdo, el dato raíz y el subárbol derecho respectivamente. Si falta un subárbol, se usa VacíoB. a2 :: ÁrbolB Integer a2 = NodoB ai 10 ad ai = NodoB aii 15 aid ad = NodoB adi 18 add aii = hojab 24 aid = hojab 27 adi = VacíoB add = hojab 24 hojab :: a ÁrbolB a hojab x = NodoB VacíoB x VacíoB

Capítulo 9. Programación con Árboles 110 Árboles binarios (II) raízb ::ÁrbolB a a raízb VacíoB =error raíz deárbol vacío raízb (NodoB x ) =x tamañob ::ÁrbolB a Integer tamañob VacíoB =0 tamañob (NodoB i r d) =1 + tamañob i + tamañob d profundidadb ::ÁrbolB a Integer profundidadb VacíoB =0 profundidadb (NodoB i r d) =1 + max (profundidadb i) (profundidadb d) EJERCICIO: Define funciones para Comprobar si un dato pertenece a un árbol. Contar cuántas veces aparece un dato en un árbol. Sumar todos los nodos de un árbol de números. Calcular el valor máximo almacenado en un árbol. Da versiones para árboles binarios y generales.

Capítulo 9. Programación con Árboles 111 Recorrido de árboles binarios enordenb ::ÁrbolB a [a] enordenb VacíoB =[ ] enordenb (NodoB i r d) =enordenb i + (r : enordenb d) preordenb ::ÁrbolB a [a] preordenb VacíoB =[ ] preordenb (NodoB i r d) =(r : preordenb i) + preordenb d postordenb ::ÁrbolB a [a] postordenb VacíoB =[ ] postordenb (NodoB i r d) =postordenb i + postordenb d + [r] Main> enordenb a2 [24, 15, 27, 10, 18, 24] :: [Integer] Main> preordenb a2 [10, 15, 24, 27, 18, 24] :: [Integer] Main> postordenb a2 [24, 27, 15, 24, 18, 10] :: [Integer] EJERCICIO: Define los recorridos en pre-orden y post-orden para árboles generales.

Capítulo 9. Programación con Árboles 112 La función fmap La función map solo está predefinida para listas, pero existe una versión sobrecargada predefinida en la siguiente clase: class Functor m fmap :: (a b) m a m b Por ejemplo, las listas son una instancia predefinida de esta clase: instance Functor [ ] fmap = map Es posible usar tanto map como fmap con listas. La función fmap también tiene sentido para árboles binarios: instance Functor ÁrbolB fmap f VacíoB =VacíoB fmap f (NodoB i r d) =NodoB (fmap f i) (f r) (fmap f d) O para árboles generales: instance Functor Árbol fmap f Vacío =Vacío fmap f (Nodo x xs) =Nodo (f x) (map (fmap f ) xs) Una función que duplique los datos enteros almacenados en cualquier funtor: duplicar :: Functor f duplicar =fmap ( 2) f Integer f Integer

Capítulo 9. Programación con Árboles 113 Consideremos Plegado de Árboles sumárbolb :: ÁrbolB Integer Integer sumárbolb VacíoB = 0 sumárbolb (NodoB i r d) = sumar (sumárbolb i) r (sumárbolb d) sumar x y z = x + y + z enordenb ::ÁrbolB a [a] enordenb VacíoB =[ ] enordenb (NodoB i r d) =concatenar (enordenb i) r (enordenb d) concatenar x y z = x + [y] + z Ambas funciones siguen el esquema: fun VacíoB = z fun (NodoB i r d) = f (fun i) r (fun d) foldárbolb :: (b a b b) b ÁrbolB a b foldárbolb f z = fun fun VacíoB = z fun (NodoB i r d) = f (fun i) r (fun d) O equivalentemente, por cumplirse foldárbolb f z = fun: foldárbolb :: (b a b b) b ÁrbolB a b foldárbolb f z VacíoB =z foldárbolb f z (NodoB i r d) =f (foldárbolb f z i) r (foldárbolb f z d)

Capítulo 9. Programación con Árboles 114 Plegado de Árboles (II) Recordemos sumárbolb VacíoB = 0 sumárbolb (NodoB i r d) = sumar (sumárbolb i) r (sumárbolb d) sumar x y z = x + y + z enordenb VacíoB = [ ] enordenb (NodoB i r d) = concatenar (enordenb i) r (enordenb d) concatenar x y z = x + [y] + z foldárbolb :: (b a b b) b ÁrbolB a b foldárbolb f z =fun fun VacíoB =z fun (NodoB i r d) =f (fun i) r (fun d) Así: sumárbolb :: ÁrbolB Integer Integer enorden sumárbolb = foldárbolb (λ x y z x + y + z) 0 :: ÁrbolB a [a] enorden = foldárbolb (λ x y z x + [y] + z) [ ] Para definir una función usando foldárbolb: Proporcionar el resultado (z) para el árbol vacío. Proporcionar función (f ) que calcule el resultado a partir del resultado para el subárbol izquierdo, la raíz y el resultado para el subárbol derecho. EJERCICIO: Define usando la función de plegado las funciones tamañob, profundidadb y enordenb

Capítulo 9. Programación con Árboles 115 Plegado de Árboles (III) Consideremos sumárbol :: Árbol Integer Integer sumárbol Vacío = 0 sumárbol (Nodo x xs) = sumar x (map sumárbol xs) sumar n ns = n + sum ns Ambas funciones siguen el esquema: fun Vacío = z fun (Nodo x xs) = f x (map fun xs) preorden :: ÁrbolB a [a] preorden Vacío = [ ] preorden (Nodo x xs) = unir x (map preorden xs) unir y ys = y : concat ys La función foldárbol captura el esquema de cómputo anterior: foldárbol :: (a [b] b) b Árbol a b foldárbol f z =fun fun Vacío =z fun (Nodo x xs) =f x (map fun xs) Así sumárbol = foldárbol (λ n ns n + sum ns) 0 preorden = foldárbol (λ y ys y : concat ys) [ ]

Capítulo 9. Programación con Árboles 116 Árboles Binarios de búsqueda Un árbol binario de búsqueda es un árbol binario tal que O bien es vacío O no es vacío y para cualquier nodo se cumple que: los elementos del correspondiente subárbol izquierdo son menores o iguales al almacenado en el nodo y los elementos del correspondiente subárbol derecho son estrictamente mayores al almacenado en el nodo 30 30 50 35 60 80 El árbol de la figura está ordenado

Capítulo 9. Programación con Árboles 117 Árboles Binarios de búsqueda (II) La siguiente función puede ser utilizada para comprobar si un árbol binario es de búsqueda: esárbolbb : Ord a ÁrbolB a Bool esárbolbb VacíoB =True esárbolbb (NodoB i r d) =todosárbolb ( r) i & todosárbolb (> r) d & esárbolbb i & esárbolbb d todosárbolb :: (a Bool) ÁrbolB a Bool todosárbolb p VacíoB =True todosárbolb p (NodoB i r d) =p r & todosárbolb p i & todosárbolb p d La función de búsqueda es más eficiente ya que si el dato no coincide con la raíz solo hay que buscar en uno de los subárboles: pertenecebb :: Ord a a ÁrbolB a Bool pertenecebb x VacíoB = False pertenecebb x (NodoB i r d) x == r = True x < r = pertenecebb x i otherwise = pertenecebb x d de modo que como máximo se realizan tantas comparaciones como profundidad tenga el árbol.

Capítulo 9. Programación con Árboles 118 Árboles Binarios de búsqueda (III) Función para insertar un nuevo dato dentro de un árbol de búsqueda, de modo que se obtenga otro árbol de búsqueda: insertarbb :: Ord a a ÁrbolB a ÁrbolB a insertarbb x VacíoB = NodoB VacíoB x VacíoB insertarbb x (NodoB i r d) x r = NodoB (insertarbb x i) r d otherwise = NodoB i r (insertarbb x d) Una propiedad interesante es que si se realiza una visita en orden de un árbol de búsqueda se obtiene una lista ordenada. Es posible ordenar una lista de datos construyendo un árbol de búsqueda con sus elementos y recorriendo éste en orden: listaaárbolbb :: Ord a [a] ÁrbolB a listaaárbolbb =foldr insertarbb VacíoB treesort :: Ord a [a] [a] treesort =enordenb. listaaárbolbb Por ejemplo: Main> treesort [4, 7, 1, 2, 9] [1, 2, 4, 7, 9] :: [Integer]

Capítulo 9. Programación con Árboles 119 Árboles Binarios de búsqueda (IV) La eliminación de un dato es un poco más complicada: si el nodo a eliminar tiene dos subárboles no se puede dejar un hueco en su lugar. Una solución consiste en tomar el mayor elemento del subárbol izquierdo del nodo a eliminar y colocar éste en el hueco. De este modo el nuevo árbol seguirá siendo ordenado: 50 eliminar 50 30 60 = 30 35 80 30 30 35 60 80

Capítulo 9. Programación con Árboles 120 Árboles Binarios de búsqueda (V) 50 eliminar 50 30 60 = 30 35 80 30 30 35 60 80 esvacíob esvacíob VacíoB esvacíob :: ÁrbolB a Bool = True = False eliminarbb :: Ord a a ÁrbolB a ÁrbolB a eliminarbb x VacíoB = VacíoB eliminarbb x (NodoB i r d) x < r = NodoB (eliminarbb x i) r d x > r = NodoB i r (eliminarbb x d) esvacíob i = d esvacíob d = i otherwise = NodoB i mi d (mi, i ) = tomamaxbb i tomamaxbb (NodoB i r VacíoB) = (r, i) tomamaxbb (NodoB i r d) = (m, NodoB i r d ) (m, d ) = tomamaxbb d tomamaxbba devuelve un par (ma, a ) donde ma es el mayor elemento del árbol de búsqueda a y a es el árbol que se obtiene al eliminar el elemento ma del árbol a. El elemento máximo se encuentra profundizando todo lo posible por la derecha en el árbol.

Capítulo 9. Programación con Árboles 121 Inducción para árboles binarios dataárbolb a = VacíoB NodoB (ÁrbolB a) a (ÁrbolB a) deriving Show Principio de inducción para valores definidos del tipo ÁrbolB a P (V acíob) x ::ÁrbolB a P(x) i, d ::ÁrbolB a, r :: a P (i) P (d) P (NodoB i r d) Vamos a probar que las funciones sumárbolb VacíoB =0 sumárbolb (NodoB i r d) =sumar (sumárbolb i) r (sumárbolb d) sumar x y z = x + y + z sumárbolb = foldárbolb (λ x y z x + y + z) 0 calculan el mismo resultado: x :: ÁrbolB Integer sumárbolb x sumárbolb x