Vous êtes sur la page 1sur 23

Estructura de Datos II

Lauro Antonio Arcos Mendez

INTRODUCCIN
En esta ultima unidad veremos los temas de rbol, arboles binarios y grafos. Nos dice que un rbol es una estructura de datos ampliamente usada que imita la forma de un rbol (un conjunto de nodos conectados). Existen dos recorridos tpicos para listar los nodos de un rbol: primero en profundidad y primero en anchura. Otros recorridos tpicos del rbol son preorden, postorden e inorden. Otro tema que veremos es el de los arboles binarios. Sus operaciones bsicas de un rbol son: enumerar, buscar, si hay un nodo listarlos, borrar un elemente, eliminar un subrbol, aadir un subrbol y encontrar la raz de cualquier nodo. Otro tema a estudiar muy importante que analizaremos es lo que son los grafos, su representacin grafica y en memoria, sus operaciones que se pueden hacer en ella.

Estructura de Datos II

Lauro Antonio Arcos Mendez

DEFINICIN DE ARBOL Un rbol es una estructura de datos ampliamente usada que emula la forma de un rbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se construye el rbol y puede tener cero o mas nodos hijos conectados a l. Se dice que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese caso, tambin decimos que b es hijo de a). Slo puede haber un nico nodo sin padres, que llamaremos raz. Un nodo que no tiene hijos se conoce como hoja. El rbol Tambin se define como una estructura de datos no lineal. Esta estructura se usa principalmente para representar datos con una relacin jerrquica entre sus elementos, como por ejemplo registros, rboles genealgicos y tablas de contenidos. Entre otros tenemos un tipo especial de de rbol que es, llamado rbol binario, que puede ser implementado fcilmente en la computadora. ARBOLES BINARIOS Un rbol Binario es un conjunto de finito de Elementos, de nombre Nodos de forma que: El rbol Binario es Vaci si no tiene ningn elemento en el. El rbol Binario contiene un Nodo Raz y los dos que parten de l, llamados Nodo Izquierdo y Nodo Derecho.

REPRESENTACIN GRFICA La representacin grfica de un rbol binario es la siguiente:

REPRESENTACION DE MEMORIA Hay dos formas tradicionales de representar un rbol binario en memoria:

Por medio de datos tipo punteros tambin conocidos como variables dinmicas o listas. Por medio de arreglos.

Estructura de Datos II

Lauro Antonio Arcos Mendez

Sin embargo la ms utilizada es la primera, puesto que es la ms natural para tratar este tipo de estructuras. Los nodos del rbol binario sern representados como registros que contendrn como mnimo tres campos. En un campo se almacenar la informacin del nodo. Los dos restantes se utilizarn para apuntar al subrbol izquierdo y derecho del subrbol en cuestin. Cada nodo se representa grficamente de la siguiente manera:

RECORRIDOS Los rboles tienen 3 Recorridos Diferentes los cuales son: Pre-Orden In-Orden Post-Orden

Pre-Orden Definicin: El Recorrido Pre-Orden lo recorre de la siguiente manera, viaje a travs del rbol Binario desplegando el Contenido en la Raz, despus viaje a travs del Nodo Izquierdo y despus a travs del Nodo Derecho. Detalles: Temp toma el Valor de la Raz y compara si el rbol tiene algn Elemento, de otra manera Desplegara rbol Vaci y terminara el mtodo. Si el rbol tiene elementos dentro de l, lo recorrer y viajara a travs de los Arreglos Izq y Der para determinar qu valor meter en la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente.

Estructura de Datos II

Lauro Antonio Arcos Mendez

Algoritmo: PreOrd(Arbol, Der, Izq, Pila, Raiz) Temp Raiz Top Pila[Top] Nulo Si Raiz = Nulo Imprimir rbol Vaci y Salir Repetir mientras Temp Nulo Imprimir Arbol[Temp] Si Der[Temp] Nulo Top Top + 1 Pila[Top] Der[Temp] Si Izq[Temp] Nulo Temp Izq[Temp] Si no: Temp Pila[Top]; Top Top - 1 Fin del ciclo Salir Diagrama:

Estructura de Datos II

Lauro Antonio Arcos Mendez

Corrida:

In-Orden Definicin: El Recorrido In-Orden lo recorre de la siguiente manera, viaje a travs del rbol Binario desplegando el Contenido en el Nodo Izquierdo despus la Raz y finalmente viaja a travs del Nodo Derecho. Detalles: Temp toma el Valor de la Raz y compara si el rbol tiene algn Elemento, de otra manera Desplegara rbol Vaci y terminara el mtodo. Si el rbol tiene elementos dentro de l, lo recorrer y viajara a travs de los Arreglos Izq y Der para determinar qu valor meter en la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente. Algoritmo:
PreOrd(Arbol, Der, Izq, Pila, Raiz) Temp Raiz Top Pila[Top] Nulo Si Raiz = Nulo Imprmir Arbol Vacio y Salir Etiqueta: Mientras Temp Nulo Top Top + 1 Pila[Top] Temp Temp Izq[Temp] Fin del ciclo

Estructura de Datos II Temp Pila[Top] Top Top - 1 Mientras Temp Nulo Imprimir Arbol[Temp] Si Der[Temp] Nulo Temp Der[Temp] Ir a Etiqueta Temp Pila[Top] Top Top - 1 Fin del ciclo Salir

Lauro Antonio Arcos Mendez

Diagrama:

Corrida:

Estructura de Datos II

Lauro Antonio Arcos Mendez

In-Orden Definicin: El Recorrido In-Orden lo recorre de la siguiente manera, viaje a travs del rbol Binario desplegando el Contenido en el Nodo Izquierdo despus el Nodo Derecho y finalmente viaja a travs de la Raiz. Detalles: Temp toma el Valor de la Raz y compara si el rbol tiene algn Elemento, de otra manera Desplegara rbol Vaci y terminara el mtodo. Si el rbol tiene elementos dentro de l, lo recorrer y viajara a travs de los Arreglos Izq y Der para determinar qu valor meter en la Pila y en Temp para de esta manera imprimir el siguiente Elemento correspondiente. Algoritmo: PostOrd(Arbol, Der, Izq, Pila, Raiz) Temp Raiz Top Pila[Top] Nulo Si Raiz = Nulo Imprimir Arbol Vacio y Salir Etiqueta: Mientras Temp Nulo Top Top + 1 Pila[Top] Temp Si Der[Temp] Nulo Top Top + 1 Pila[Top] - (Der[Temp]) Temp Izq[Temp] Temp Pila[Top] Top Top - 1 Fin del ciclo Mientras Temp 0 Imprimir Arbol[Temp] Si Arbol[Temp] = Info[Raiz] Salir Temp Pila[Top] Top Top - 1 Fin del ciclo Si Temp < 0 Temp = -(Temp) Ir a Etiqueta Salir

Estructura de Datos II

Lauro Antonio Arcos Mendez

Diagrama:

Corrida:

Bsqueda Definicin: La Bsqueda es Similar a todas los Mtodos anteriores de Bsqueda, simplemente efecta un recorrido comparando el Elemento que deseas encontrar contra cada uno de los Elementos en los Arreglos.

10

Estructura de Datos II

Lauro Antonio Arcos Mendez

Detalles: El Algoritmo de Bsqueda compara el Elemento a buscar con cada uno de los datos de nuestro rbol, compara si el Elemento con el Nodo Raz, si no se encuentra en la Raz compara Elemento contra la Raz para empezar a viajar por el rbol respectivamente, usa un mtodo similar al anterior hasta encontrar el Elemento. De otra forma la bsqueda es fallida. Algoritmo: Busqueda(Arbol, Der, Izq, Pila, Raiz, Elem) Si Raiz = Nulo Imprimir Arbol Vacio Pos Nulo Pad Nulo Regresar Pos y Pad Salir Si Elem = Arbol[Raiz] Imprimir Elemento Encontrado Pos Raiz Pad Nulo Regresar Pos y Pad Salir Si Elem < Arbol[Raiz] Temp Izq[Raiz] Temp2 Raiz Si no: Temp Der[Raiz] Temp2 Raiz Mientras Temp Nulo Si Elem = Arbol[Temp] Imprimir Elemento Encontrado Pos Temp Pad Temp2 Regresar Pos y Pad Salir Si Elem < Arbol[Temp] Temp2 Temp Temp Izq[Temp] Si no: Temp2 Temp Temp Der[Temp] Fin del ciclo Imprimir Elemento no Encontrado Pos Nulo Pad Temp2

11

Estructura de Datos II

Lauro Antonio Arcos Mendez

Regresar Pos y Pad Salir

Diagrama:

Corrida:

12

Estructura de Datos II

Lauro Antonio Arcos Mendez

OPERACIONES DE RBOLES Las operaciones comunes en rboles son: Enumerar todos los elementos. Buscar un elemento. Dado un nodo, listar los hijos (si los hay). Borrar un elemento. Eliminar un subrbol (algunas veces llamada podar). Aadir un subrbol (algunas veces llamada injertar). Encontrar la raz de cualquier nodo.

13

Estructura de Datos II

Lauro Antonio Arcos Mendez

DEFINICIN DE GRAFO Un grafo, G, es un par ordenado de V y A, donde V es el conjunto de vrtices o nodos del grafo y A es un conjunto de pares de vrtices, a estos tambin se les llama arcos o ejes del grafo. Un vrtice puede tener 0 o ms aristas, pero toda arista debe unir exactamente a dos vrtices. Los grafos representan conjuntos de objetos que no tienen restriccin de relacin entre ellos. Un grafo puede representar varias cosas de la realidad cotidiana, tales como mapas de carreteras, vas frreas, circuitos elctricos, etc. La notacin G = A (V, A) se utiliza comnmente para identificar un grafo. Los grafos son estructuras de datos no lineales que tienen una naturaleza generalmente dinmica. Su estudio podra dividirse en dos grandes bloques:

Grafos Dirigidos. Grafos no Dirigidos (pueden ser considerados un caso particular de los anteriores).

Los grafos se constituyen principalmente de dos partes: las aristas, vrtices y los caminos que pueda contener el mismo grafo. Aristas Son las lneas con las que se unen las aristas de un grafo y con la que se construyen tambin caminos. Si la arista carece de direccin se denota indistintamente {a, b} o {b, a}, siendo a y b los vrtices que une. Si {a ,b} es una arista, a los vrtices a y b se les llama sus extremos.

Aristas Adyacentes: Se dice que dos aristas son adyacentes si convergen en el mismo vrtice. Aristas Paralelas: Se dice que dos aristas son paralelas si vrtice inicial y el final son el mismo.

14

Estructura de Datos II

Lauro Antonio Arcos Mendez

Aristas Cclicas: Arista que parte de un vrtice para entrar en el mismo. Cruce: Son dos aristas que cruzan en un punto.

Vrtices Son los puntos o nodos con los que est conformado un grafo. Llamaremos grado de un vrtice al nmero de aristas de las que es extremo. Se dice que un vrtice es `par' o `impar' segn lo sea su grado.

Vrtices Adyacentes: si tenemos un par de vrtices de un grafo (U, V) y si tenemos un arista que los une, entonces U y V son vrtices adyacentes y se dice que U es el vrtice inicial y V el vrtice adyacente. Vrtice Aislado: Es un vrtice de grado cero. Vrtice Terminal: Es un vrtice de grado 1.

Caminos Sean x, y " V, se dice que hay un camino en G de x a y si existe una sucesin finita no vaca de aristas {x,v1}, {v1,v2},..., {vn,y}. En este caso

x e y se llaman los extremos del camino El nmero de aristas del camino se llama la longitud del camino. Si los vrtices no se repiten el camino se dice propio o simple. Si hay un camino no simple entre 2 vrtices, tambin habr un camino simple entre ellos. Cuando los dos extremos de un camino son iguales, el camino se llama circuito o camino cerrado. Llamaremos ciclo a un circuito simple Un vrtice a se dice accesible desde el vrtice b si existe un camino entre ellos. Todo vrtice es accesible respecto a si mismo

15

Estructura de Datos II

Lauro Antonio Arcos Mendez

REPRESENTACIN DE GRAFOS EN PROGRAMAS Hay tres maneras de representar un grafo en un programa: mediante matrices, mediante listas y mediante matrices dispersas.

Representacin mediante matrices: La forma ms fcil de guardar la informacin de los nodos es mediante la utilizacin de un vector que indexe los nodos, de manera que los arcos entre los nodos se pueden ver cmo relaciones entre los ndices. Esta relacin entre ndices se puede guardar en una matriz, que llamaremos de adyacencia. Representacin mediante listas: En las listas de adyacencia lo que haremos ser guardar por cada nodo, adems de la informacin que pueda contener el propio nodo, una lista dinmica con los nodos a los que se puede acceder desde l. La informacin de los nodos se puede guardar en un vector, al igual que antes, o en otra lista dinmica. Representacin mediante matrices dispersas: Para evitar uno de los problemas que tenamos con las listas de adyacencia, que era la dificultad de obtener las relaciones inversas, podemos utilizar las matrices dispersas, que contienen tanta informacin como las matrices de adyacencia, pero, en principio, no ocupan tanta memoria como las matrices, ya que al igual que en las listas de adyacencia, slo representaremos aquellos enlaces que existen en el grafo.

RECORRIDO DE UN GRAFO Recorrer un grafo significa tratar de alcanzar todos los nodos que estn relacionados con uno que llamaremos nodo de salida. Existen bsicamente dos tcnicas para recorrer un grafo: el recorrido en anchura; y el recorrido en profundidad.

Recorrido en anchura: El recorrido en anchura supone recorrer el grafo, a partir de un nodo dado, en niveles, es decir, primero los que estn a una distancia de un arco del nodo de salida, despus los que estn a dos arcos de distancia, y as sucesivamente hasta alcanzar todos los nodos a los que se pudiese llegar desde el nodo salida. Recorrido en profundidad: el recorrido en profundidad trata de buscar los caminos que parten desde el nodo de salida hasta que ya no es posible avanzar ms. Cuando ya no puede avanzarse ms sobre el camino elegido, se vuelve atrs en busca de caminos alternativos, que no se estudiaron previamente.

16

Estructura de Datos II

Lauro Antonio Arcos Mendez

OPERACIONES BSICAS DE LOS GRAFOS En los grafos, como en todas las estructuras de datos, las dos operaciones bsicas son insertar y borrar. En este caso, cada una de ellas se desdobla en dos, para insertar/eliminar vrtices e insertar/eliminar aristas. Insertar vrtice La operacin de insercin de un nuevo vrtice es una operacin muy sencilla, nicamente consiste en aadir una nueva entrada en la tabla de vrtices (estructura de datos que almacena los vrtices) para el nuevo nodo. A partir de ese momento el grafo tendr un vrtice ms, inicialmente aislado, ya que ninguna arista llegar a l. Insertar arista Esta operacin es tambin muy sencilla. Cuando se inserte una nueva arista en el grafo, habr que aadir un nuevo nodo a la lista de adyacencia (lista que almacena los nodos a los que un vrtice puede acceder mediante una arista) del nodo origen, as si se aade la arista (A,C), se deber incluir en la lista de adyacencia de A el vrtice C como nuevo destino. Eliminar vrtice Esta operacin es inversa a la insercin de vrtice. En este caso el procedimiento a realizar es la eliminacin de la tabla de vrtices del vrtice en s. A continuacin habr que eliminar las aristas que tuviesen al vrtice borrado como origen o destino. Eliminar arista Mediante esta operacin se borra un arco del grafo. Para llevar a cabo esta accin es necesario eliminar de la lista de adyacencia del nodo origen el nodo correspondiente al nodo destino. Otras operaciones Las operaciones adicionales que puede incluir un grafo son muy variadas. Adems de las clsicas de bsqueda de un elemento o recorrido del grafo, tambin podemos encontrarnos con ejecucin de algoritmos que busquen caminos ms cortos entre dos vrtices, o recorridos del grafo que ejecuten alguna operacin sobre todos los vrtices visitados, por citar algunas operaciones de las ms usuales.

17

Estructura de Datos II

Lauro Antonio Arcos Mendez

Arboles.java
//Lauro Antonio Arcos Mendez public class Arboles { public Arboles() { System.out.println("Un rbol genrico"); } public Arboles(String tipo) { System.out.println("Un rbol tipo " + tipo); } public Arboles(int altura) { System.out.println("Un rbol de " + altura + " metros"); } public Arboles(int altura,String tipo) { System.out.println("Un " + tipo + " de " + altura + " metros"); } public static void main(String args[]) { Arboles arbol1 = new Arboles(4); Arboles arbol2 = new Arboles("Roble"); Arboles arbol3 = new Arboles(); Arboles arbol4 = new Arboles(5,"Pino"); } }

18

Estructura de Datos II

Lauro Antonio Arcos Mendez

ArbolBinario.java
//Lauro Antonio Arcos Mendez //Definicion de la clase NodoBinario Public class ArbolBinario{ int dato; NodoBinario Hizq, Hder; //Constructores NodoBinario (int Elem){ dato = Elem; NodoBinario Hizq, Hder = null; } //Insercion de un elemento public void InsertaBinario (int Elem){ if(Elem < dato){ if (Hizq == null) Hizq = new NodoBinario(Elem); else Hizq.InsertaBinario(Elem); } else{ if (Elem > dato){ if (Hder == null) Hder = new NodoBinario (Elem); else Hder.InsertaBinario(Elem); } } } } //Definicion de la clase Arbol class Arbol{ Cola Cola = new Cola(); NodoBinario Padre; NodoBinario Raiz; //Constructor public Arbol(){ Raiz = null; } //Insercion de un elemento en el arbol public void InsertaNodo(int Elem){ if(Raiz == null) Raiz = new NodoBinario (Elem); else

19

Estructura de Datos II Raiz.InsertaBinario (Elem); } //Preorden Recursivo del arbol public void Preorden (NodoBinario Nodo){ if(Nodo == null) return; else{ System.out.print (Nodo.dato + " "); Preorden (Nodo.Hizq); Preorden (Nodo.Hder); } } //PostOrden recursivo del arbol public void PostOrden (NodoBinario Nodo){ if(Nodo == null) return; else{ PostOrden (Nodo.Hizq); PostOrden (Nodo.Hder); System.out.print (Nodo.dato + " "); } } //Inorden Recursivo del arbol public void Inorden (NodoBinario Nodo){ if(Nodo == null) return; else{ Inorden (Nodo.Hizq); System.out.print(Nodo.dato + " "); Inorden (Nodo.Hder); } } //Busca un elemento en el arbol void Busqueda (int Elem, NodoBinario A){ if((A == null) | (A.dato == Elem)){ System.out.print(A.dato + " "); return; } else{ if(Elem>A.dato) Busqueda (Elem, A.Hder); else Busqueda ( Elem, A.Hizq); }

Lauro Antonio Arcos Mendez

20

Estructura de Datos II }

Lauro Antonio Arcos Mendez

//Altura del arbol public int Altura (NodoBinario Nodo){ int Altder = (Nodo.Hder == null? 0:1 + Altura (Nodo.Hder)); int Altizq = (Nodo.Hizq == null? 0:1 + Altura (Nodo.Hizq)); return Math.max(Altder,Altizq); } //Recorrido en anchura del arbol public void Anchura (NodoBinario Nodo){ Cola cola= new Cola(); NodoBinario T = null; System.out.print ("El recorrido en Anchura es: "); if(Nodo != null){ cola.InsertaFinal (Nodo); while(!(cola.VaciaLista ())){ T = cola.PrimerNodo.datos; cola.EliminaInicio(); System.out.print(T.dato + " "); if (T.Hizq != null) cola.InsertaFinal (T.Hizq); if (T.Hder != null) cola.InsertaFinal (T.Hder); } } System.out.println(); } } //Definicin de la Clase NodoLista class NodosListaA{ NodoBinario datos; NodosListaA siguiente; //Construtor Crea un nodo del tipo Object NodosListaA (NodoBinario valor){ datos =valor; siguiente = null; //siguiente con valor de nulo } // Constructor Crea un nodo del Tipo Object y al siguiente nodo de la lista NodosListaA (NodoBinario valor, NodosListaA signodo){ datos = valor; siguiente = signodo; //siguiente se refiere al siguiente nodo } }

21

Estructura de Datos II //Definicin de la Clase Lista class Cola{ NodosListaA PrimerNodo; NodosListaA UltimoNodo; String Nombre;

Lauro Antonio Arcos Mendez

//Constructor construye una lista vacia con un nombre de List public Cola(){ this ("Lista"); } //Constructor public Cola (String s){ Nombre = s; PrimerNodo = UltimoNodo =null; } //Retorna True si Lista Vaca public boolean VaciaLista() { return PrimerNodo == null; } //Inserta un Elemento al Frente de la Lista public void InsertaInicio (NodoBinario ElemInser){ if(VaciaLista()) PrimerNodo = UltimoNodo = new NodosListaA (ElemInser); else PrimerNodo = new NodosListaA (ElemInser, PrimerNodo); } //Inserta al Final de la Lista public void InsertaFinal(NodoBinario ElemInser){ if(VaciaLista()) PrimerNodo = UltimoNodo = new NodosListaA (ElemInser); else UltimoNodo=UltimoNodo.siguiente =new NodosListaA (ElemInser); } //Eliminar al Inicio public void EliminaInicio(){ if(VaciaLista()) System.out.println ("No hay elementos"); // Restablecer las referencias de PrimerNodo y UltimoNodo if(PrimerNodo.equals (UltimoNodo)) PrimerNodo = UltimoNodo = null; else PrimerNodo = PrimerNodo.siguiente;

22

Estructura de Datos II } //Elimina al final public void EliminaFinal (){ if(VaciaLista()) System.out.println ("No hay elementos");

Lauro Antonio Arcos Mendez

// Restablecer las referencias de PrimerNodo y UltimoNodo if (PrimerNodo.equals (UltimoNodo)) PrimerNodo = UltimoNodo = null; else{ NodosListaA Actual =PrimerNodo; while (Actual.siguiente != UltimoNodo) Actual = Actual.siguiente; UltimoNodo =Actual; Actual.siguiente = null; } } }

class ArbolBinarioA{ public static void main (String[]args){ Arbol A = new Arbol(); A.InsertaNodo (10); A.InsertaNodo (7); A.InsertaNodo (8); A.InsertaNodo (6); A.InsertaNodo (12); A.InsertaNodo (11); A.InsertaNodo (5); A.InsertaNodo (4); A.InsertaNodo (3); A.InsertaNodo (2); System.out.print("El recorrido en Preorden es: "); A.Preorden (A.Raiz); System.out.println(); System.out.print("El recorrido en Inorden es: "); A.Inorden (A.Raiz); System.out.println(); System.out.print("El recorrido en Postorden es: "); A.PostOrden (A.Raiz); System.out.println(); System.out.println("La altura del arbol es: " + A.Altura (A.Raiz)); A.Anchura (A.Raiz); } }

23

Estructura de Datos II

Lauro Antonio Arcos Mendez

CONCLUSIN
Como ya vimos en esta unidad los arboles son estructura de datos que son como los arboles y me refiero a su forma y estructura que vemos donde quiera que vamos porque un rbol tiene ramas y mas ramas y todo viene de una raz, tienen un conjunto de nodos conectados, digamos que estos nodos fueran sus ramas que hacen que estn conectados. El rbol binario con tiene un nodo raz y los dos que parten de l se le llaman nodo izquierdo y nodo derecho. Los arboles son muy importantes porque pueden ser utilizados por ejemplo como ayuda para realizar bsquedas en conjuntos de datos. Por otro lado los grafos que se puede decir que significa trazar nos son de utilidad para representar grficamente un problema dibujando un grafo como un conjunto de puntos y con lneas conectndolos.

24

Estructura de Datos II

Lauro Antonio Arcos Mendez

BIBLIOGRAFA
http://www.mitecnologico.com/Main/ArbolesDefinicion.html

http://www.mitecnologico.com/Main/OperacionesBasicasArbolesBi narios http://www.programacionfacil.com/estructura_de_datos/arbol_bin ario http://es.wikipedia.org/wiki/Grafo_%28estructura_de_datos%29 http://www.mitecnologico.com/Main/RecorridosEnUnArbol http://apuntes.rincondelvago.com/grafos.html

25

Vous aimerez peut-être aussi