Algoritmos y Programación II 75.41

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

Estructura de Datos Unidad 6: ARBOLES

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

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

Árboles Binarios Ordenados Árboles AVL

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

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

Arboles Binarios de Búsqueda en C++

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

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

Algoritmos y Programación II Curso 2006

Programación Estructuras Arborescentes

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

ARBOLES ARBOLES COMPUTACIONALES MATEMATICAS DISCRETAS II

El TAD Árbol. El TAD Árbol

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

Definición recursiva de los árboles

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

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

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

ESTRUCTURA DE DATOS. ABB Arboles de Búsqueda Binaria

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

Definición de árbol. Árboles

Estructura de Datos. Estructuras de Datos no lineales : Árboles

Programación TADs Arboles

Capítulo 8. Árboles. Continuar

Estructuras de Datos Clase 20 Árboles de búsqueda

ESTRUCTURAS DE DATOS Y ALGORITMOS

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

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

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

Estructuras de Datos

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

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

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

Estructuras de datos utilizando JAVA

Estructuras de Datos y Algoritmos

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.

EJERCICIOS DE ÁRBOLES BINARIOS

Segundo parcial de Programación 2

3. ÁRBOLES. Definición. Un árbol es un conjunto finito de nodos R, tal que:

PRÁCTICA No. 9 RECORRIDOS EN ÁRBOLES BINARIOS

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Árboles y esquemas algorítmicos. Tema III

ARBOLES B. Lo que si es cierto es que la letra B no significa "binario", ya que:

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

Ejercicios del Tema 3 Estructuras jerárquicas: Árboles

Diseño de Conjuntos y Diccionarios

Existen varios tipos de árboles: 5.1 Árboles binarios

Estructuras de datos y algoritmos

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


Eduardo Mosqueira Rey Bertha Guijarro Berdiñas Mariano Cabrero Canosa

árbol como un conjunto de nodos y líneas

Francisco J. Hernández López

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.

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

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

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

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

Árboles AVL. Lección 14

Tema 10: Árbol binario de búsqueda

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

Examen de Traductores, Intérpretes y Compiladores. Convocatoria ordinaria de Junio de er Curso de I.T. Informática de Sistemas.

Programación de sistemas

Á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.

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.

Tema 6: Estructuras de datos recursivas

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.

Estructuras de datos: Árboles binarios de

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

Estructura de Datos. Árboles. Árboles. Primer Semestre, 2010 ÍNDICE DE CONTENIDOS

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

ELO320 Estructuras de Datos y Algoritmos. Heap & HeapSort. Tomás Arredondo Vidal

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

Árboles. Alonso Ramírez Manzanares Computación y Algoritmos Friday, March 17, 17

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

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

Árboles B y B ) 20. Algoritmos y Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 63

Estructura de Datos Árboles Árboles 2-3

LISTAS ENLAZADAS FUNDAMENTOS TEORICOS

Tema 4. Estructuras no lineales de datos: árboles

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

Árboles Binarios Ordenados Árboles AVL

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

Estructuras de Datos Clase 10 Árboles binarios

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

Estructuras de Datos y Algoritmos (ITIS). TAD Tree. Estructuras de Datos y Algoritmos (ITIS) Ingeniería Técnica en Informática de Sistemas, Curso 2º

Instituto Politécnico Nacional

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

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

Introducción a Árboles Árboles Binarios

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

EDA. Tema 8 Colas de Prioridad: Heaps

Clase 32: Árbol balanceado AVL

ÁRBOLES BINARIOS DE BÚSQUEDA (ABB)

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

Matemáticas Discretas Tc1003 Teoría de Grafos

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

Algoritmos y Programación II 75.41

Transcripción:

Algoritmos y Programación II 75.41 Cátedra: Lic. Gustavo Carolo Guía de Estudio Enero 2005

Indice Indice 2 Definición 3 Árbol Binario 4 Árbol General 5 Árbol AVL 5 Árbol B 6 Implementación de Binarios con Punteros 7 AB.H 7 AB.C 8 Recorridos de un Árbol 11 PreOrden 11 InOrden 11 PosOrden 12 Árbol Binario Ordenado (ABO) 12 Implementación 12 ABO.H 12 ABO.C 13 2/14

Definición Un árbol es una colección o conjunto de nodos relacionados. La definición más natural es la recursiva. Esta formado por un nodo raíz la cual tiene 0 a n (sub)árboles que se relacionan por medio de la arista o rama. Se dice que el árbol tiene N niveles, siendo N también entonces la cantidad de nodos de la rama más larga. Una rama es una secuencia de nodos que se extiende desde la raíz del árbol hasta un nodo Hoja o Terminal. Un nodo hoja o terminal es aquel que no tiene ningún subárbol dependiente. Nodo Raíz: A Nodos Hojas o Terminales: B-C-H-I-Ñ-O-K-L-M-N Nivel 1 del Árbol: A Nivel 4 del Árbol: Ñ-O Profundidad del Árbol: 4 Ramas más larga: A-E-J-Ñ // A-E-J-O 3/14

Árbol Binario Un árbol binario es una clase especial de árbol, donde cada subnodo tiene como máximo dos hijos o subnodos relacionados. A estos dos subnodos se los conoce normalmente como hijo izquierdo e hijo derecho respectivamente del nodo. En el árbol genérico como el de la figura que se encuentra más arriba en esta página el número de hijos de cada nodo puede variar bastante, siendo por ello difícil de implementar en un sistema computacional donde los recursos son limitados y tienen que ser usados en forma eficiente. Un árbol binario tiene a lo sumo dos hijos, por lo cual se puede implementar mucho más fácilmente. raíz Subárbol 1 Subárbol 2 Uno de los usos principales del árbol binario es el de búsquedas binarias. Cada uno de los elementos de los nodos tiene que estar identificado por una clave. Para la implementación de estos tipos de árboles, se decide un criterio para la ubicación y posterior búsqueda de los nodos, generalmente todas las claves menores se ubican a izquierda y las mayores a derecha. Cuando se busca una determinada clave, se aplica el concepto recursivo del árbol, de la siguiente forma: Se compara la clave buscada con la clave del elemento ubicado en la raíz del árbol. Si es el elemento buscado, finalizó la búsqueda. En caso contrario, se evaluará si la clave buscada es menor que la del nodo raíz, entonces se continuará la búsqueda solo en el subárbol izquierdo que contiene las claves menores a la actual y en caso contrario se continuará la búsqueda solo en el subárbol derecho. Para los subárboles se aplica el mismo procedimiento hasta encontrarlo (de ahí el concepto recursivo). Si el árbol binario se encuentra balanceado, es decir posee una cantidad pareja de nodos a izquierda y a derecha, la cantidad de búsquedas se reduce en forma logarítmica. Esto es, resulta más ventajosa cuanto mayor sea el número de nodos. Árbol Binario de Búsqueda RAIZ 5 4 10 2 7 11 1 3 6 9 4/14

Árbol General Es un tipo de árbol cuyos nodos permiten cualquier cantidad de hijos. Un ejemplo de árbol general puede ser la estructura jerárquica de directorios de un sistema operativo. Mis Documentos varios Curriculum Facultad Informes Curriculum.doc Foto.gif AlgoII Proba Info1.doc Info2.doc Tp3.doc ab.c ab.h Árbol AVL Un árbol AVL (Adelson - Velskii y Landis) es un árbol binario de búsqueda con una condición de equilibrio. Un árbol AVL es un árbol binario de búsqueda en el cual las alturas de los subárboles izquierdo y derecho de la raíz difieren cuando mucho en 1, y a su vez los subárboles izquierdo y derecho de la raíz son árboles AVL. Cada nodo de un árbol AVL tiene asociado un factor de balance que indica la diferencia entre las alturas de los sub-árboles. RAIZ 5 + - 4 10 - - 2 7 11 0 0 6 9 0 5/14

Árbol B Aunque todos los árboles de búsqueda vistos son binarios, existe un árbol de búsqueda ampliamente utilizado que no es binario. Este es el llamado árbol-b. Un árbol B es un árbol n-ario al cual se le asocia un número natural m llamado orden. Un árbol B de orden m es un árbol con las siguientes propiedades estructurales: La raíz es una hoja o tiene entre 2 o más hijos. Todos los nodos internos (los nodos que no son hojas, excepto la raíz) tiene entre [m/2] y m hijos. Todos los nodos internos tienen una cantidad de claves igual a su cantidad de hijos - 1. Todas las hojas están a la misma profundidad. 6/14

Implementación de Binarios con Punteros AB.H #ifndef AB_H #define AB_H #include <stdlib.h> #define IZQ 1 #define DER 2 #define PAD 3 #define RAIZ 4 typedef struct TNodoAB void* elem; struct TNodoAB *izq, *der; TNodoAB; typedef struct TAB TNodoAB *raiz,*cte; int tamdato; TAB; void AB_Crear(TAB *a,int tdato); void AB_ElemCte(TAB a,void *elem); void AB_ModifCte(TAB *a,void *elem); void AB_MoverCte(TAB *a,int mov,int *error); void AB_Vaciar(TAB *a); int AB_Vacio(TAB a); void AB_Insertar(TAB *a,int mov,void *elem,int *error); #endif 7/14

AB.C #include "ab.h" #include <memory.h> void AB_Crear(TAB *a,int tdato) a->tamdato = tdato; a->raiz = NULL; a->cte = NULL; void AB_ElemCte(TAB a,void *elem) memcpy(elem,a.cte->elem,a.tamdato); void AB_ModifCte(TAB *a,void *elem) memcpy(a->cte->elem,elem,a->tamdato); TNodoAB* BuscarPadre(TNodoAB *padre,tnodoab *hijo) TNodoAB *paux = NULL; if ((padre->izq == hijo) (padre->der == hijo)) return padre; if (padre->izq!= NULL) paux = BuscarPadre(padre->izq,hijo); if ((padre->der!= NULL) && (paux == NULL)) paux = BuscarPadre(padre->der,hijo); return paux; void AB_MoverCte(TAB *a,int mov,int *error) *error = 0; switch (mov) case IZQ : if (a->cte->izq!= NULL) a->cte = a->cte->izq; break; case DER : if (a->cte->der!= NULL) a->cte = a->cte->der; break; case PAD : if (a->cte!= a->raiz) a->cte = BuscarPadre(a->raiz,a->cte); 8/14

break; case RAIZ : if (a->raiz!= NULL) a->cte = a->raiz; break; default : void VaciarSub(TNodoAB *pnodo) if (pnodo!= NULL) if ((pnodo->izq == NULL) && (pnodo->der == NULL)) free(pnodo->elem); free(pnodo); VaciarSub(pnodo->izq); VaciarSub(pnodo->der); free(pnodo->elem); free(pnodo); void AB_Vaciar(TAB *a) VaciarSub(a->raiz); a->raiz = NULL; a->cte = NULL; void AB_Insertar(TAB *a,int mov,void *elem,int *error) TNodoAB *paux; *error = 0; paux = (TNodoAB*) malloc(sizeof(tnodoab)); paux->izq = NULL; paux->der = NULL; if (paux) paux->elem = malloc(a->tamdato); if (paux->elem) memcpy(paux->elem,elem,a->tamdato); switch(mov) case IZQ : if (a->cte->izq == NULL) a->cte->izq = paux; break; case DER : if (a->cte->der == NULL) a->cte->der = paux; 9/14

break; case RAIZ : if (a->raiz == NULL) a->raiz = paux; break; default : if (*error) free(paux->elem); free(paux); a->cte = paux; /* if (paux->elem) */ free(paux); /* if (paux) */ int AB_Vacio(TAB a) if (a.raiz == NULL) return 1; return 0; 10/14

Recorridos de un Árbol Existen varias formas de recorrer un árbol binario, desde el punto de vista del orden en que se recorren los elementos: PreOrden Primero se procesa el nodo corriente, luego el subárbol izquierdo, y luego el subárbol derecho. void PreOrden(TAB ab, int MOV) TelemAB eab; int error; AB_MoverCte(&ab,MOV,&error); if (!error ) AB_ElemCte(ab,&eab); procesar(eab); PreOrden(ab,IZQ); PreOrden(ab,DER); InOrden Primero se procesa el subárbol izquierdo, luego el nodo corriente, y luego el subárbol derecho. void InOrden(TAB ab, int MOV) TelemAB eab; int error; AB_MoverCte(&ab,MOV,&error); if (!error ) InOrden(ab,IZQ); AB_ElemCte(ab,&eab); procesar(eab); InOrden(ab,DER); 11/14

PosOrden Primero se procesa el subárbol izquierdo, luego el subárbol derecho, y luego el nodo corriente. void PosOrden(TAB ab, int MOV) TelemAB eab; int error; AB_MoverCte(&ab,MOV,&error); if (!error ) PosOrden(ab,IZQ); PosOrden(ab,DER); AB_ElemCte(ab,&eab); procesar(eab); Árbol Binario Ordenado (ABO) Este tipo de árbol se caracteriza por manejar desde las primitivas la inserción ordenada de los elementos. Para ello, la primitiva utilizará una función de comparación que será indicada por parámetro al momento de la creación del árbol. Además, se incorpora una primitiva que permite buscar un elemento por su clave. Para utilizar la función de comparación se hace uso de una característica de C que son los punteros a funciones. De esta forma es posible guardar en un puntero el llamado a una función, en nuestro caso se usara una función que recibe los dos elementos a comparar y devuelve un entero indicando que elemento si los elementos son distintos o iguales. Así, es posible guardar en este árbol cualquier tipo de elementos indicando la función de comparación correspondiente (Ver el apunte de C para más información sobre punteros a funciones) Implementación Solo se muestran las primitivas que cambian respecto al Árbol Binario ABO.H #ifndef TDA_ABO_H #define TDA_ABO_H #include <stdlib.h> #define IZQ 1 #define DER 2 #define PAD 3 #define RAIZ 4 12/14

typedef struct TNodoABO void* elem; struct TNodoABO *izq, *der; TNodoABO; typedef struct TAB TNodoABO *raiz,*cte; int tamdato; int (*fcomp)(void *,void *); /* Puntero a la función de comparación */ TABO; void ABO_Crear(TABO *a,int tdato, int (*comp)(void *,void *)); void ABO_Insertar(TABO *a,void *elem,int *error); #endif ABO.C #include "tda_abo.h" void ABO_Crear(TABO *a,int tdato, int (*comp)(void *,void *)) a->tamdato = tdato; a->raiz = NULL; a->cte = NULL; a->fcomp = comp; int buscar_lugar(tabo *a, TNodoABO **p, void *elem) int c; if (*p!= NULL) c = (*(a->fcomp))((*p)->elem,elem); if (c == 1) buscar_lugar(a,&((*p)->izq),elem); if (c == -1) buscar_lugar(a,&((*p)->der),elem); return 1; *p = (TNodoABO*) malloc(sizeof(tnodoabo)); (*p)->izq = NULL; (*p)->der = NULL; if (*p) (*p)->elem = malloc(a->tamdato); if ((*p)->elem) memcpy((*p)->elem,elem,a->tamdato); return 0; 13/14

free(*p); return 1; return 1; return 1; void ABO_Insertar(TABO *a, void *elem,int *error) *error = buscar_lugar(a,&(a->raiz),elem); 14/14