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

Documentos relacionados
Clase 26. Introducción a los árboles. Árboles

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

Algoritmos y Estructuras de Datos. Guillermo Román Díez

Árbol ABB equilibrado. Lección: Árboles. Algorítmica II (Tema 4) Lenguajes y Sistemas Informáticos, Universidad Pablo de Olavide 1/ 58

Programación de sistemas Árboles

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

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

2. Con una lista ordenada, aunque la localización y eliminación es rápida el problema es en la inserción de datos pues puede ser del orden de O(n).

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º

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

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Programación II Árboles binarios de búsqueda (ABB)

INGENIERIA DE SISTEMAS 19 ESTRUCTURAS DE DATOS (Listas simples) ARBOLES

Programación Estructuras Arborescentes

Tema 4- Representación Enlazada

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

Programación de sistemas

Roberto Carlos Abreu Díaz. October 28, 2009

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Sólo una opción es correcta en cada pregunta. Cada respuesta correcta suma 1 4. puntos. Cada respuesta incorrecta resta 1 12

95.12 Algoritmos y Programación II Práctica 7: árboles

Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios

Tema 7: Árbol Binario

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

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.

EDA. Tema 8 Colas de Prioridad: Heaps

ESTRUCTURAS DE DATOS Y ALGORITMOS

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º. Leonardo DaVinci. Piccasso La Tempestad. Mona Lisa

Estructuras de Datos Clase 14 Árboles binarios de búsqueda

Carlos Delgado Kloos Mª Carmen Fernández Panadero Raquel M. Crespo García Ingeniería Telemática Univ. Carlos III de Madrid

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

PROGRAMA EDUCATIVO INFORMATICA ADMINISTRATIVA

Estructuras de datos y algoritmos

Aprender los conceptos, manejo, usos y aplicación de heaps a fin de utilizarlos para el desarrollo de aplicaciones

Programación II Arboles Binarios(AB)

Árboles Carlos Delgado Kloos Mª Carmen Fernández Panadero Raquel M. Crespo García Ingeniería Telemática Univ. Carlos III de Madrid

Tema 10: Árbol binario de búsqueda

Tema: ARBOLES. Instructor: MC. Gerardo Gálvez Gámez Junio de 2018 INTRODUCCIÓN:

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

Grados Ing. Inf. y Mat. Inf. Noviembre 2011 Algoritmos y Estructura de Datos Página 1 de 6

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

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

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

Estructuras de Datos Clase 10 Árboles binarios

Estructuras de Datos. 14 de junio de Apellidos

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

Programación de sistemas Listas enlazadas

Tema 09: TAD Árbol binario

Una clave Definición informal La clave debe contener una secuencia de una o más letras seguidas por uno o más dígitos

Estructura de Datos. Índice

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

LISTAS CIRCULARES. // Métodos private CElemento() {} // constructor. ultimo

ESTRUCTURA DE DATOS Y ALGORITMOS Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Ejercicio 1 (proyecto prlistas, paquete listas)

Eduardo Mosqueira Rey Bertha Guijarro Berdiñas Mariano Cabrero Canosa

Programación de Sistemas GIT, GISC, GISA, GITT

Titulación: Ingeniero Técnico en Informática de Gestión Curso: 2º Nombre y apellidos: Nota:

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

A) PREORDEN B) INORDEN C) POSTORDEN D) NIVELES

Tipos Recursivos de Datos

Examen de Estructuras de Datos y Algoritmos (Ingeniería Informática)

2ª Parte: Problemas (5 puntos sobre 10)

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

La máxima distancia entre dos nodos de un árbol está dada por alguna de las 3 siguientes: La máxima distancia entre dos nodos del subárbol izquierdo.

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

Pilas Motivación

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

Estructura de Datos Unidad 6: ARBOLES

Estructura de Datos. Unidad V Estructuras no lineales estáticas y dinámicas. (Árboles y grafos)

Estructuras de Datos Clase 7 Listas e Iteradores (segunda parte)

Algoritmos y Estructuras de Datos Iteradores. Guillermo Román Díez

EJERCICIO 2 (3 PUNTOS) A) Sea el árbol binario AVL de la figura siguiente: B) Dada la estructura de la figura siguiente:

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

Examen Teórico. Convocatoria de Febrero de 2018

Examen Teórico Convocatoria de Junio de 2012

Programación de sistemas

Estructura de datos y Programación

Estructura de Datos Tema 6. Árboles. Contenido 14/06/2018

Estructuras de datos: Árboles binarios de

Estructuras de Datos

Este material es de uso exclusivo para clase de algoritmos y estructura de datos, la

Arboles Binarios de Búsqueda en C++

Listas enlazadas. Programación de Sistemas

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

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.

1. Cuál es el número total máximo de nodos que tiene un árbol binario de N niveles? a. N 2-1 b. 2 N+1-1 c. 2 N d. 2 N+1 i.

Segundo parcial de Programación 2

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

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

PRÁCTICA No. 9 RECORRIDOS EN ÁRBOLES BINARIOS

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Estructura de Datos. Listas Enlazadas

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Descubrir los árboles como paradigma de los tipos Recursivos de Datos

Estructuras de Datos Clase 4 Pilas y colas

Tipos de Datos Recursivos

Transcripción:

Clase adicional 9 Temas Listas enlazadas Árboles Problemas de la clase adicional Ejercicios de diseño Listas enlazadas Previamente en este curso, ya habrá trabajado con dos de las estructuras de datos más básicas: los arrays y los vectores. En esta clase adicional, estudiaremos estructuras de datos más avanzadas: las listas enlazadas, los árboles y los grafos. Aunque los arrays son una buena solución para almacenar un número de conjunto del mismo tipo de objetos, y aunque los vectores nos permiten controlar dinámicamente el tamaño del espacio de almacenamiento, ambas estructuras de datos tienen un inconveniente importante. Si queremos insertar o eliminar una entrada, es preciso desplazar hacia arriba o hacia abajo todos los elementos situados debajo de dicha entrada copiándolos en los elementos adyacentes. A pesar de que es posible salvar esta dificultad (por ejemplo, estableciendo los elementos no utilizados en null), la cantidad de memoria utilizada en un sistema de estas características podría ser ingente y sería necesario modificar el código para manipular todos los espacios vacíos. Un método más eficaz para almacenar los datos que puedan requerir numerosas adiciones y eliminaciones es la lista enlazada. Definición Una lista enlazada es una serie de objetos que saben" dónde se encuentra el siguiente miembro de la lista en la memoria del ordenador. El último miembro de la lista suele indicar que el miembro siguiente es un "null". Para lograrlo, cada objeto de la lista debe disponer de un miembro que pueda almacenar la ubicación en la memoria del siguiente objeto de la lista. Este tipo de listas son listas enlazadas simples, ya que el código puede desplazarse en la lista en una sola dirección. También existen listas enlazadas dobles. Una referencia al objeto de la lista suele indicar el comienzo de la misma. Operaciones en listas enlazadas Algunas de las operaciones básicas que pueden realizarse en una lista enlazada son: Crear una lista Buscar un elemento en la lista Insertar un elemento al final de la lista Eliminar una elemento de la lista Implementación en Java

El siguiente código es una implementación sencilla de una lista enlazada: (NOTA: para resumir, el código para buscar un elemento en la lista se incluye en el método de eliminación). Aquí está la clase que declara los datos básicos en cada enlace de la lista: class Check private static int totalchecks=0; // una variable para el seguimiento de todas las comprobaciones private int checknumber; private double checkamount; private Check nextcheck; // referencia a la siguiente comprobación de la lista public Check ( double amount ) checknumber = ++totalchecks; checkamount = amount; nextcheck = null; public static int gettotalchecks() return totalchecks; public int getchecknumber() return checknumber; public Check getnextcheck() return nextcheck; public void setnextcheck(check c) nextcheck = c; public void print() System.out.println("Número de comprobación: #" + checknumber + "; Check Amount : $"+ checkamount); Éste es el código que proporciona los operadores de la lista (añadir, eliminar, está vacío, etc.) Se incluye una excepción como ejemplo en el método deletechecks. Sería mejor que el código comprobase los null antes de buscar otro enlace, y no que se estancase en la excepción para tratar la excepción NullPointerException que se genera al intentar leer un objeto que no existe. class ListOfChecks // crea una referencia a nuestra lista private Check head; public ListOfChecks() // establece la referencia a la lista en null, ya que la lista // no tiene ningún miembro Check head = null; public boolean isempty() return (head == null); // si la lista está vacía, devolver true public boolean addtoend ( double amount ) if ( isempty() ) // si la lista está vacía, comenzar una nueva

... head = new Check(amount); else // "Recorrer la lista" hasta llegar al final (esto es, cuando la siguiente comprobación es null) Check temp = head; while (temp.getnextcheck()!= null) temp = temp.getnextcheck(); temp.setnextcheck(new Check(amount)); // Colocar una marca al final return (true); //... y devolver true public boolean deletecheck ( int number ) if ( isempty() ) return (false); // si no hay lista, no se elimina nada else if (head.getchecknumber() == number) head = head.getnextcheck(); // La memoria eliminada se ha perdido porque no hay ninguna referencia // la recolección de basura devuelve la memoria al sistema. else Check temp = head; Check previous = null; // necesito recordar la comprobación que hay antes de la que quiero eliminar while (temp.getchecknumber()!= number) // antes de seguir, recordar de dónde viene previous = temp; temp = temp.getnextcheck(); // cuando termina el bucle, temp será la comprobación // que debe eliminarse y previous será la comprobación // anterior. Así que queremos que la comprobación que ahora // sigue a temp, siga a previous System.out.println("La comprobación " + temp.getchecknumber() + " se acaba de eliminar. ); previous.setnextcheck(temp.getnextcheck()); return (true); public void print() int total = 0; if (!isempty()) Check temp = head; while (temp!= null) temp.print(); temp = temp.getnextcheck(); total++; System.out.println("Número total de comprobaciones: " +total);

System.out.println("Número de comprobaciones escritas: " + Check.getTotalChecks()); El código siguiente prueba las dos clases anteriores. public class ListOfChecksTest public static void main(string args[]) ListOfChecks mylist = new ListOfChecks(); mylist.addtoend(1830.50); mylist.addtoend(255.68); mylist.addtoend(99.99); mylist.print(); mylist.deletecheck(2); mylist.addtoend(140.50); mylist.print(); Árboles Los árboles son estructuras de datos cuya apariencia hace exactamente honor a su nombre, con la salvedad de que se dibujan al revés, como las raíces. Después de las listas, son el siguiente método importante para organizar los datos. Terminología A continuación incluimos una lista de la terminología que se utiliza al referirse a los árboles: Nodo Nodo raíz Nodo hijo Nodo padre Nodo de hoja Subárbol Antecesor Descendiente Profundidad Árbol ordenado Parte más pequeña de un árbol que almacena datos abstractos. El árbol empieza desde un nodo raíz y se ramifica en varios nodos hijos que, a su vez, se extienden para formar otros nodos hijos. Un nodo raíz puede no tener nodos hijos; se trataría de un nodo único del árbol y recibe el nombre de nodo de hoja. Nodo que se ramifica a partir de un nodo padre. Un nodo hijo siempre tiene un nodo padre. Nodo que se ramifica en nodos hijos. Los nodos padres pueden tener uno o varios nodos hijos. Nodo sin hijos. Parte del árbol que nace desde un nodo concreto, es decir, desde dicho nodo y todos sus descendientes. Un antecesor de un nodo A es cualquier nodo entre el nodo raíz (incluido) y el padre de A. Un descendiente de un nodo A es cualquier nodo hijo de A o un descendiente. Todos los nodos del subárbol que nace en A serán descendientes de A. Indica la profundidad del árbol; el número máximo de pasos necesarios para alcanzar cualquier nodo de hoja desde el nodo raíz. Un árbol ordenado es un árbol en el que los hijos de un nodo se ordenan de modo específico.

factor de ramificación Número máximo de hijos que puede tener un nodo. Aplicado a árboles, se dice que cada el número de nodos que cada nodo de dicho árbol no puede tener no puede superar el de hijos. Los datos se almacenan en nodos. El árbol comienza desde un nodo raíz y se ramifica en uno o más nodos que, a su vez, se extienden para crear uno o varios nodos y así sucesivamente hasta terminar en nodos de hoja. Los nodos padres se ramifican en nodos hijos. Existen distintas secuencias posibles para recorrer un árbol. Las más comunes son: Preorder: Inorder: Postorder: raíz subárbol izquierdo subárbol derecho subárbol izquierdo raíz subárbol derecho subárbol izquierdo subárbol derecho raíz A continuación se muestra un algoritmo recursivo para realizar el recorrido Inorder de un árbol binario. public class BinaryTree private Object value; private BinaryTree left = null; private BinaryTree right = null; public Vector getinorder() Vector vec = new Vector(); return traverseinorder( this, vec ); private Vector traverseinorder( BinaryTree b, Vector v ) if ( b!= null ) traverseinorder( left, v ); v.addelement( value ); traverseinorder( right, v );

return v; Problemas de la clase adicional Problema 1 Todos los elementos de cada lista enlazada siempre tienen: a. Una referencia a otro elemento de la lista o un puntero NULL. b. Ninguna referencia. c. Una referencia al primer elemento de la lista. d. Una referencia al último elemento de la lista. Problema 2 Si un árbol binario tiene un valor de clave padre inferior que el del hijo izquierdo, pero superior que el del hijo derecho, cuál de los siguientes recorridos imprimirá los datos en orden descendiente? a. Preorder. b. Inorder. c. Postorder. d. Ninguno de los anteriores. Ejercicios de diseño 1. Complete la clase BinaryTree con tres tipos distintos de recorridos (por ejemplo, preorder, inorder y postorder) y un método main() para realizar la comprobación. En el método main(), construya en primer lugar el árbol binario y, a continuación, recórralo con los tres métodos distintos e imprima el resultado de los recorridos. 2. Los profesores adjuntos del curso 1.00 han decidido redactar una aplicación de Java para realizar el seguimiento de las calificaciones de los estudiantes en el cuestionario 2. En concreto, han decidido utilizar una lista enlazada como estructura de datos para almacenar las calificaciones de todos los estudiantes. Ayúdeles a escribir un método llamado count() que devuelva el número de estudiantes que han obtenido una calificación por encima de un umbral determinado. En primer lugar, ayude a los profesores adjuntos a definir una clase llamada Student para almacenar los identificadores y las calificaciones de todos los estudiantes y el acceso que devuelve la calificación del estudiante. A continuación, ayude a los profesores adjuntos a escribir una clase StudentListTest con una función main y un método count( ). En la función main, cree una lista que almacene la información de varios estudiantes. Posteriormente, llame al método count( ) para encontrar los estudiantes con calificaciones por encima de la nota umbral. El método count( ) tiene la siguiente firma: public static int count (List s, int threshold)

El primer argumento, s, es una referencia a una lista enlazada de objetos Student. El segundo argumento especifica el umbral de calificaciones. Queremos contar el número de estudiantes que han obtenido una calificación igual o superior al umbral. El método devolverá el resultado del recuento como un integer. No debe modificar List s. Sugerencia: se recomienda utilizar la clase java.util.linkedlist y la interfaz java.util.iterator para este problema.