Ejercicios Resueltos de Árboles y Grafos

Page 1

Segunda Edición

Universidad Fermín Toro

SAIA A

ENERO 2016

Ejercicios Resueltos de Árboles y Grafos

Estructuras


Contenido Definición Grafos

Nodos. Aristas. Grado de Entrada. Grado de Salida. Caminos Simples. Conexo.

Ejemplos

Función Recursiva en un Árbol Binario.

Sobre el Autor Violeta León CI 18262154 SAIA A

Bibliografía Estructuras de Datos. Tercera Edición. Osvaldo Cairó. Silvia Guardatti.


Grafo No Dirigido G de la figura 1: Árbol Binario de la Figura 1

Figura 1

Descripción Formal G= {V, A} Conjunto de Nodos: V = {H, J, F, L, T, R} Conjunto de Aristas: A = {(H,J), (H,T), (J,F), (J,T), (F,L), (F,R)} Grado de Cada Nodo: H grado: 2 debido a J, T J grado: 3 debido a H, F, T F grado: 2 debido a R, L L grado: 1 debido a F T grado: 2 debido a H, T R grado: 1 debido a F


Figura 2

Grafo Dirigido de la Figura 2

Descripción Formal Conjunto de Vértices V = {M, L, K, T, D} Conjunto de Aristas A = {(M,L), (M,D), (L,T), (L,A), (K,T), (K,M), (D,K), (D,L)} Grado de Entrada de los Nodos M grado 1: debido a K D grado 1: debido a M K grado 2: debido a L, D L grado 2: debido a M, D T grado 2: debido a L, K Grado de Salida de los Nodos M grado 2: debido a L, D M grado 2: debido a K, L M grado 2: debido a M, T M grado 2: debido a K, T T grado 0: no tiene salidas. El camino mas simple del vértice M al vértice T es {M, D, L, T}


¿Grafo Conexo? Figura 3

Camino Simple del Nodo A al Nodo F {A, C, P, S, D, F} Camino Corto del Nodo C al Nodo D {C, P, S, D} ¿Es un grafo conexo? el grafo si es conexo. Debemos recordar que para que un grafo sea conexo debe existir al menos una trayectoria o camino entre cada par de nodos. Si pensamos en los nodos P y B, existe una trayectoria: {P, S, B}. Asímismo, entre los nodos A y D: {A, C, P, S, D}. En el resto de los nodos, es sencillo encontrar los caminos entre ellos, dado que están en la misma trayectoria.

Matriz de Pesos

Figura 4

Matriz de Pesos

Lista de Adyacencias



Matriz de Adyacencia y su Grafo

Lista de Adyacencias

Recorrido en profundidad desde el nodo C Pre orden: (raíz, izquierdo, derecho): { C, B, D, E, A} In orden: (izquierdo, raíz, derecho): {B, D, E, C, A} Post orden: (izquierdo, derecho, raíz): {E, D, B, A, C} Recorrido en anchura desde el nodo C: {C, B, A, D, E}


Identificar Grafos Dirigidos Aciclícos Figura 8

Figura 9

En la figura 8 podemos observar que no es un grafo dirigido aciclíco, debido a que existen los siguientes ciclos: Ciclo 1: {A, D, B, F, A} Ciclo 2: {A, W, E, D, B, F, A} Ciclo 3: {E, D, B, F, A, W, E} Ciclo 4: {F, A, D, B, F} En cambio, la figura 9 si representa a un grafo dirigido aciclíco porque no tiene ciclos.

Recorrido In, Pre y Post Árbol correspondiente al recorrido en pre orden: GEAIBMCLDFKJH, en in orden IABEGLDCFMKHJ, y en post orden IBAEDLFCHJKMG.


Pasatiempos


Programa Para Recorrrido en Post Orden /*Fichero: comprobar.c */ #include < stdio.h> #include < stdlib.h> #include < string.h> char *preorden=”GEAIBMCLDFKJH”; char *inorden=”IABEGLDCFMKHJ”; char *postorden; void post(char *pre,char *in,char *pos,int n) { int longIzqda; if(n!=0){ pos[n-1]=pre[0]; longIzqda=strchr(in,pre[0])-in; post (pre+1,in,pos,longIzqda); post (pre+1+longIzqda,in+1+longIzqda,pos+longIzqda,n-1longIzqda); }} int main(int argc,char *argv[]) { int aux; aux=strlen(preorden); postorden=(char *)malloc(aux*sizeof(char)); if (postorden){ printf(“El preorden es: %s\n”,preorden); printf(“El inorden es: %s\n”,inorden); post(preorden,inorden,postorden,aux); postorden[aux]=’\0’; printf(“El postorden calculado es: %s\n”,postorden); free(postorden); } else{ fprintf(stderr,”Error: Sin memoria\n”); return 1; } return 0; }


Función No Recursiva Para un Árbol en Orden /*Fichero: comprobar.c */ #include < pilas.h> #include < arbolesB.h> void inordenNR(ArbolB T,void (* EscribirElemento)(void *),int tamano) { NodoB nodoActual,aux; void *et; Pila p; int fin; int faltaHD; /*Indica si falta el hijo derecho*/ p=CrearPila(sizeof(NodoB)); et=malloc(tamano); if(!et){ .... /*Error:Sin memoria*/ } aux=NODOB_NULO; Push(&aux,p); nodoActual=RaizB(T); fin=0; while(!fin){ while(nodoActual!=NODOB_NULO){ Push(&nodoActual,p); nodoActual=HijoIzqdaB(nodoActual,T); } Tope(&nodoActual,p); Pop(p); if (nodoActual!=NODOB_NULO){ EtiquetaArbolB(et,nodoActual,T); (*EscribirElemento)(et); nodoActual=HijoDrchaB(nodoActual,T); } else fin=1; } free(et); DestruirPila(p);}


Función Recursiva Para Determinar la Cantidad de Nodos en un Árbol Binario int numero(NodoB n,ArbolB T) { if (n==NODOB_NULO) return 0; else return 1+numero(HijoIzqdaB(n,T),T)+numero(HijoDrchaB(n,T),T); }

Función Recursiva Para Determinar la Altura de un Árbol Binario #define MAXIMO(a,b) ((a) < (b)?(b):(a)) int altura(NodoN n,ArbolB T) { if(n==NODOB_NULO) return -1; else return 1+MAXIMO(altura(HijoIzqdaB(n,T),T),altura(HijoDrchaB(n,T),T));}


http://ingenieradeideas.blogspot.com

Estructuras


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.