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

Documentos relacionados
Grados Ing. Inf. y Mat. Inf. Julio 2014 Algoritmos y Estructura de Datos Página 1 de 6

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Árboles binarios de búsqueda

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

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

Propedéutico de Programación

Árboles. Un grafo no dirigido es un árbol si y sólo si existe una ruta unica simple entre cualquiera dos de sus vértices.


PROGRAMACION ORIENTADA A OBJETOS Ingenieria Informática Final Febrero 2006/07

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

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

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

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

Algoritmos y estructuras de datos

Capítulo 6. ÁRBOLES.

Estructuras de datos: Árboles binarios de

Estructuras de datos. Estructuras de datos

Definición 1.1 Sea G = (V, A) un grafo no dirigido. G se denomina árbol si es conexo y no contiene ciclos.

VI Colas de prioridad

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

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

Estructuras de Datos. Estructuras de Datos para Conjuntos Disjuntos

Notas de Clase. Prof. Juan Andrés Colmenares, M.Sc. Instituto de Cálculo Aplicado Facultad de Ingeniería Universidad del Zulia. 21 de febrero de 2004

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

Soluciones Ejercicios Tema 3

<tipo> Tipo de dato de los elementos del vector

[GUIÓN DE CLASES TEÓRICAS]

Algorítmica y Complejidad. Tema 3 Ordenación.

ESTRUCTURAS DE DATOS ÁRBOLES 143

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Ejercicios de la asignatura Programación II

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

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

Excepciones en Java Colecciones e iteradores Genericidad Cierre de UML

Tablas Hash y árboles binarios

Árboles binarios de búsqueda ( BST )

Tema 2. El lenguaje de programación Java (Parte 1)

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

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Mostrar Números Ascendentemente. Soluciones Ejercicios Tema 5. tostring Recursivo de LEG. Suma Recursiva de un Vector (1/3)

Colecciones. Nadjet Bouayad-Agha Programación 2007

árbol como un conjunto de nodos y líneas

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

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

Proyecto 6. Árboles de decisión: Un árbol de decisión es un modelo de predicción utilizado en el ámbito de la inteligencia artificial.

Árboles AVL. Laboratorio de Programación II

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

Examen Parcial de Programación II Ejercicio Práctico

Examen escrito de Programación 1. Jueves 5 de febrero de Problema 1 o (3.5 puntos)

Patrones de Diseño. Patrón estructural Composite. Técnicas de Programación - Curso 2007/08

Algoritmos de Strings. Héctor Navarro

EJERCICIOS DE ÁRBOLES BINARIOS

Centro Asociado Palma de Mallorca. Tutor: Antonio Rivero Cuesta

Árboles Binarios Ordenados Árboles AVL

Examen final de CL 11 de Enero de 2012 Fecha de publicación de notas: Fecha de revisión:

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

Programación Orientada a Objetos. Java: Excepciones

Clase 32: Árbol balanceado AVL

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Estructuras de Datos Abstractas en Lenguaje Java

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Colecciones de Java LSUB. 17 de febrero de 2016 GSYC

Programación Orientada a Objetos. Java: Excepciones

Metodología y Tecnología de la Programación

Hoja 4: Solución. public String tostring() { return "("+getx()+", "+gety()+")"+" Lado: "+getlx();

Instituto de Computación - Facultad de Ingeniería - Universidad de la República

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

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

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

Unidad Nº V Listas Enlazadas

Elementos léxicos del lenguaje de programación Java

Parte II: Estructuras de datos y algoritmos

C# para no Programadores

Aprendizaje activo: flujos

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Primer Parcial de Programación 3 (1/10/2009)

3. ESTRUCTURAS DE DATOS NO LINEALES

Profesorado de Informática Ciencias de la Computación INET- DFPD Matemática I - Matemática Discreta usando el computador Ing. Prof.

Asignaturas: Estructura de Datos y Algoritmos/Algoritmos I Códigos: 3325/3301. Algebra (Algoritmos I)

Tutorial 11. Temas. Búsqueda Clasificación Estructura de Java Collection Problemas del tutorial Ejercicios de diseño. Búsqueda

Solución - práctico 10

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

1.2. Es Java un lenguaje ideal para aprender a programar? 1.4. Cuáles son las versiones y distribuciones Java y cuál usar?

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

TIPO DE DATO ABSTRACTO (TDA)

Administración Local Soluciones

Grafos. Suponiendo que e = [u, v]. Entonces los nodos u y v se llaman extremos de e y u y v se dice que son nodos adyacentes o vecinos.

Apuntes de Algoritmos y Estructuras de Datos, Programación III, Fac. de Informática UNLP. Alejandro Santos. 7 de agosto de

Registro (record): es la unidad básica de acceso y manipulación de la base de datos.

Serialización de datos en C# en Binario, Soap y Xml

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Ampliación de Estructuras de Datos

Grafos. Amalia Duch Brown Octubre de 2007

Tema 3: Herencia en Java. Programación Orientada a Objetos Curso 2009/2010 Begoña Moros Valle

Transcripción:

Algoritmos y Estructuras de Datos Árboles Generales y Árboles Binarios Guillermo Román Díez groman@fi.upm.es Universidad Politécnica de Madrid Curso 2015-2016 Guillermo Román, UPM AED: Introducción 1/22

Árboles generales El objetivo de los árboles es organizar los datos de forma jerárquica Se suelen utilizar en las implementaciones de otros TADs (colas con prioridad, maps ordenados,... ) Árbol General Un árbol general es o bien vacío o bien tiene dos componentes: (1) un nodo raíz que contiene un elemento, y (2) un conjunto de cero o más (sub)árboles hijos. Un árbol está formado por nodos Un nodo tiene un elemento y un conjunto de nodos que son la raíz de los subárboles hijos Guillermo Román, UPM AED: Introducción 2/22

Terminología Raíz ( root ): nodo sin padre Nodo interno ( internal node ): nodo con al menos un hijo Nodo externo ( external node ): nodo sin hijos Nodo hoja ( leaf node ): sinónimo de nodo externo, usaremos estos dos nombres indistintamente Subárbol ( subtree ): árbol formado por el nodo considerado como raíz junto con todos sus descendientes Ancestro de un nodo: un nodo w es ancestro de v si y sólo si w es v o w es el padre de v o w es ancestro del padre de v Descendiente de un nodo (la inversa de ancestro): v es descendiente de w si y sólo si w es ancestro de v Guillermo Román, UPM AED: Introducción 3/22

Terminología Hermano ( sibling ) de un nodo: nodo con el mismo padre Arista ( edge ) de un árbol: par de nodos en relación padre-hijo o hijo-padre Grado ( degree ) de un nodo: el número de hijos del nodo Grado ( degree ) de un árbol: el máximo de los grados de todos los nodos Camino ( path ) de un árbol: secuencia de nodos tal que cada nodo consecutivo forma una arista. La longitud del camino es el número de aristas Árbol ordenado ( ordered tree ): existe un orden lineal (total) definido para los hijos de cada nodo: primer hijo, segundo hijo, etc... Guillermo Román, UPM AED: Introducción 4/22

Terminología La profundidad de un nodo ( depth ) es la longitud del camino que va desde ese nodo hasta la raíz (o viceversa) La altura de un nodo ( height ) es la longitud del mayor de todos los caminos que van desde el nodo hasta una hoja Altura de un árbol no vacío: la altura de la raíz Nivel ( level ): conjunto de nodos con la misma profundidad. Así, tenemos desde el nivel 0 hasta el nivel h donde h es la altura del árbol Guillermo Román, UPM AED: Introducción 5/22

Interfaz Tree public interface Tree <E > { public int size (); public boolean isempty (); public Iterator <E > iterator (); public Iterable < Position <E >> positions (); public E replace ( Position <E > v, E e) throws InvalidPositionException ; public Position <E > root () throws EmptyTreeException ;... Guillermo Román, UPM AED: Introducción 6/22

Interfaz Tree<E> public interface Tree <E > {... public Position <E > parent ( Position <E > v) throws InvalidPositionException, BoundaryViolationException ; public Iterable < Position <E >> children ( Position <E > v) throws InvalidPositionException ; public boolean isinternal ( Position <E > v) throws InvalidPositionException ; public boolean isexternal ( Position <E > v) throws InvalidPositionException ; public boolean isroot ( Position <E > v) throws InvalidPositionException ; Guillermo Román, UPM AED: Introducción 7/22

Interfaz Tree<E> Pregunta Tree<E> es un interfaz pensado para trabajar directamente con posiciones Los métodos trabajan con posiciones y no con árboles (no son recursivos) Tenemos dos métodos que devuelven un Iterable children devuelve un Iterable para recorrer los hijos de un nodo positions() devuelve un Iterable que es un snapshot de los nodos del árbol El interfaz sólo se dispone de métodos observadores Sólo está pensado para hacer recorridos de árboles Los métodos modificadores se definirán en las clases que implementan el interfaz qué os parece esto? Guillermo Román, UPM AED: Introducción 8/22

Ejemplos recorrido Ejemplo Método que indica si un nodo es ancestro de otro boolean ancestro (Tree <E> t, Position <E> w, Position <E > v) throws InvalidPositionException { return w == v! t. isroot ( v) && (w == t. parent (v) ancestro (t,w,t. parent (v))); Guillermo Román, UPM AED: Introducción 9/22

Ejemplos recorrido Ejemplo Método que indica si un nodo es hermano de otro boolean issibling ( Tree <E > t, Position <E> w, Position <E > v) throws InvalidPositionException { if (w == v t. isroot (w) t. isroot (v)) return false ; else return t. parent (w) == t. parent (v); Guillermo Román, UPM AED: Introducción 10/22

Ejemplos recorrido Ejemplo Método que indica si un nodo es hermano de otro (algo retorcido) boolean issibling (Tree <E> t, Position <E> w, Position <E > v) throws InvalidPositionException { if (w == v t. isroot (w) t. isroot (v)) return false ; else { Iterator < Position <E>> it = t. parent (w). children (). iterator (); boolean found = false ; while (it. hasnext () &&!( found = it. next () == v)) ; return found ; Guillermo Román, UPM AED: Introducción 11/22

Ejemplos recorrido Ejemplo Método que calcula la profundidad de un nodo de un árbol dado (iterativo) int depth (Tree <E> tree, Position <E> v) throws InvalidPositionException { int c; for (c = 0;! tree. isroot (v); c++, v= tree. parent (v)) ; return c; Guillermo Román, UPM AED: Introducción 12/22

Ejemplos recorrido Ejemplo Método que calcula la profundidad de un nodo de un árbol dado (recursivo) int depth (Tree <E> tree, Position <E> v) throws InvalidPositionException { if ( tree. isroot (v)) return 0; else return 1 + depth (tree, tree. parent (v)); Guillermo Román, UPM AED: Introducción 13/22

Ejemplos recorrido Ejemplo Método que recorre un árbol en pre-orden String tostringpreorder ( Tree <E > tree, Position <E > v) throws InvalidPositionException { String s = v. element (). tostring (); for ( Position <E> w : tree. children (v)) { s +=, + tostringpreorder ( tree, w); return s; Guillermo Román, UPM AED: Introducción 14/22

Ejemplos recorrido Ejemplo Método que recorre un árbol en post-orden String tostringpostorder ( Tree <E > tree, Position <E > v) throws InvalidPositionException { String s = ; for ( Position <E> w : tree. children (v)) { s += tostringpostorder ( tree, w) + ; s += v. element (); return s; Guillermo Román, UPM AED: Introducción 15/22

Árboles Binarios Es un tipo especial de árbol en el que todo nodo tiene como mucho 2 hijos Es un árbol ordinario con grado 2 Árbol Binario Un árbol binario es o bien vacío o bien consiste en (1) un nodo raíz, (2) un (sub)árbol izquierdo, y (3) un (sub)árbol derecho. Podemos hablar de varios tipos: Arbol binario propio (proper binary tree): todo nodo interno tiene 2 hijos Arbol binario impropio (improper binary tree): árbol binario que no es propio Guillermo Román, UPM AED: Introducción 16/22

Árboles Binarios Árbol binario perfecto es un árbol binario propio con el máximo número de nodos: 2 h+1 1 o h = 0 2^{ h +1-1 = 1 o h = 1 / \ 2^{ h +1-1 = 3 o o o h = 2 / \ 2^{ h +1-1 = 7 o o / \ / \ o oo o Guillermo Román, UPM AED: Introducción 17/22

Árboles Binarios Árbol binario equilibrado Un árbol en el que para todo nodo, el valor absoluto de la diferencia de altura entre los dos subárboles hijos es como máximo 1. Es decir, un árbol en el que para todo nodo con altura h, o bien sus dos hijos tienen la misma altura, h 1, o un hijo tiene altura h 1 y el otro h 2 Todo subárbol de un árbol equilibrado es también equilibrado Guillermo Román, UPM AED: Introducción 18/22

Árboles Binarios public interface BinaryTree <E > extends Tree <E > { public Position <E > left ( Position <E > v) throws InvalidPositionException, BoundaryViolationException ; public Position <E > right ( Position <E > v) throws InvalidPositionException, BoundaryViolationException ; public boolean hasleft ( Position <E > v) throws InvalidPositionException ; public boolean hasright ( Position <E > v) throws InvalidPositionException ; Guillermo Román, UPM AED: Introducción 19/22

Ejemplos recorrido Ejemplo Método que devuelve la altura de un árbol binario int height ( BinaryTree <E > tree, Position <E > v) throws InvalidPositionException { if ( tree. isexternal (v)) return 0; int hi = 0, hd = 0; if ( tree. hasleft (v)) hi = height (tree, tree. left (v)); if ( tree. hasright (v)) hd = height (tree, tree. right (v)); return 1 + Math. max (hi,hd); Guillermo Román, UPM AED: Introducción 20/22

Ejemplos recorrido Ejemplo Recorrido de un árbol binario en pre-orden y en post-orden void preorder ( BinaryTree <E > tree, Position <E > v) throws InvalidPositionException { /* visit v. element () */ if (t. hasleft (v)) preorder (tree, tree. left (v)); if (t. hasright (v)) preorder (tree, tree. right (v)); void postorder ( BinaryTree <E > tree, Position <E > v) throws InvalidPositionException { if (t. hasleft (v)) postorder (tree, tree. left (v)); if (t. hasright (v)) postorder (tree, tree. right (v)); /* visit v. element () */ Guillermo Román, UPM AED: Introducción 21/22

Ejemplos recorrido Ejemplo Los árboles binarios también permiten el recorrido en inorden void inorder ( BinaryTree <E > tree, Position <E > v) throws InvalidPositionException { if ( tree. hasleft (v)) inorder (tree, tree. left (v)); /* visit v. element () */ if ( tree. hasright (v)) inorder (tree, tree. right (v)); Guillermo Román, UPM AED: Introducción 22/22