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