You are on page 1of 8

Resuelve los siguientes ejercicios, elaborando lo que se te pide, entregarlos para el da Jueves 12 de Abril del 2012, impresos con

portada y folder.
Ejercicio n1: Escriba un programa que acepte un apuntador a un nodo y devuelva un valor verdadero si este nodo es la raz de un rbol binario vlido y falso en caso contrario. Arbol::Arbol(Nodo* &r,int x) { a=new Nodo [x]; r=NULL; act=x; } bool Arbol::raiz() { bool raiz; if(r==act) else raiz=false; return raiz; } raiz=true;

Ejercicio n2: Escriba un programa que acepte un apuntador a un rbol binario y un apuntador a un nodo del rbol, y devuelva el nivel del nodo en el rbol.

Ejercicio n3: Escriba un programa para ejecutar el experimento siguiente: genere 100 nmeros aleatorios. Conforme se genera cada nmero, insrtelo en un rbol de bsqueda binaria inicialmente vaco. Despus de insertar los 100 nmeros, imprima el nivel de la hoja que tiene el nivel ms grande y el nivel de la hoja que tiene el nivel ms chico. Repita este proceso 50 veces. Imprima una tabla que indique cuntas veces de las 50 ejecuciones produjeron una diferencia entre el nivel de hoja mximo y mnimo de 0,1,2,3, y as sucesivamente. #include<stdlib.h> #include<stdio.h> #include<conio.h> #include<iostream.h> #include<dos.h> #define VERDADERO 1 #define FALSO 0 #define VECES 50 //LA CANTIDAD DE VECES QUE SE EFECTUA LA OPERACION #define cant_num 100 //LA CANTIDAD DE NUMEROS QUE CONTENDRA EL ARBOL #define RANGO 100 //EL RANGO DE NUMEROS ALEATORIOS typedef struct tipoceldaABB { struct tipoceldaABB *izq,*der; int etiqueta; } *nodoABB; typedef nodoABB ABB; ABB Crear(int et) { ABB raiz; raiz = new(tipoceldaABB); if (raiz == NULL) printf("Memoria Insuficiente."); raiz->izq =NULL; raiz->der = NULL; raiz->etiqueta = et; return(raiz); } void Inserta(int x,ABB *t) { if(!(*t)){ *t=(nodoABB)malloc(sizeof(struct tipoceldaABB)); if(!(*t)){ printf("Memoria Insuficiente."); } (*t)->etiqueta=x; (*t)->izq=NULL; (*t)->der=NULL; } else if(x<(*t)->etiqueta) Inserta(x,&((*t)->izq)); else Inserta(x,&((*t)->der)); }

int nivel_mayor(ABB p) { if(p==NULL) return 0; else { int nivelI=nivel_mayor(p->izq); int nivelD=nivel_mayor(p->der); if (nivelI>nivelD) return nivelI+1; else return nivelD+1; } } int nivel_menor(ABB p) { if(p==NULL) return 0; else { int nivelI=nivel_menor(p->izq); int nivelD=nivel_menor(p->der); if (nivelI<nivelD) return nivelI+1; else return nivelD+1;

} } void main() { int res; int arr[VECES]; int num; int alto[50]; int bajo[50]; ABB raiz; randomize();

for(int CONT1=1;CONT1<=VECES;CONT1++) { clrscr(); cout<<" LOS NUMEROS INSERTADOS EN EL ARBOL SON..."<<endl; for(int CONT2=1;CONT2<=cant_num;CONT2++) { num=random(RANGO); //genero el numero aleatorio cout<<num<<"\t"; if(CONT2>1) else } alto[CONT1]=nivel_mayor(raiz); cout<<endl; printf("EL NIVEL MAS ALTO DEL %d ARBOL GENERADO ES = %d\n",CONT1,alto[CONT1]); bajo[CONT1]=nivel_menor(raiz); printf("EL NIVEL MAS BAJO DEL %d ARBOL GENERADO ES = %d",CONT1,bajo[CONT1]); arr[CONT1]=alto[CONT1]-bajo[CONT1]; cout<<endl<<endl; Inserta(num,&raiz); raiz=Crear(num);

for(int x=1;x<=RANGO;x++) { res=0; for(int i=1;i<=cant_num;i++) { if(x==arr[i]) res++; } if(res>0) printf("SE REPITEN %d VECES EL NUMERO %d\n",res,x); } getch(); break; } }

Ejercicio n4: Supongamos que tenemos una funcin valor tal que dado un valor de tipo char (una letra del alfabeto) devuelve un valor entero asociado a dicho identificador.Supongamos tambien la existencia de un rbol de expresin T cuyos nodos hoja son letras del alfabeto y cuyos nodos interiores son los caracteres *,+,-,/.Disear una funcin que tome como parmetros un nodo y un rbol binario y devuelva el resultado entero de la evaluacin de la expresin representada. int Evalua(NodoB n,ArbolB T) { char ident; EtiquetaArbolB(&c,n,T); switch(c){ case '+': return Evalua(HijoIzqdaB(n,T),T)+Evalua(HijoDrchaB(n,T),T); break; case '-': return Evalua(HijoIzqdaB(n,T),T)-Evalua(HijoDrchaB(n,T),T); break; case '*': return Evalua(HijoIzqdaB(n,T),T)*Evalua(HijoDrchaB(n,T),T); break; case '/': return Evalua(HijoIzqdaB(n,T),T)/Evalua(HijoDrchaB(n,T),T); break; default: return valor(c); }

Ejercicio n5: El recorrido en preorden de un determinado rbol binario es: GEAIBMCLDFKJH y en inorden IABEGLDCFMKHJ .Resolver: A) Dibujar el rbol binario.

B) Dar el recorrido en postorden. I B A E D L F C H J K M G. C) Disear una funcin para dar el recorrido en postorden dado el recorrido en preorden e inorden y escribir un programa para comprobar el resultado del apartado anterior. #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-1-longIzqda); }

} /*----------------------------------------*/ 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;

Ejercicio n6: Implementar una funcin no recursiva para recorrer un rbol binario en inorden. #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){ .... } aux=NODOB_NULO; Push(&aux,p); nodoActual=RaizB(T); fin=0; while(!fin){

/*Error:Sin memoria*/

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); }

Ejercicio n7: Escribir una funcin que realice la reflexin de un rbol binario. void Refleja(ArbolB T) { ArbolB Ti,Td; if(T!=ARBOLB_VACIO){ Ti=PodarHijoIzqdaB(RaizB(T),T); Td=PodarHijoDrchaB(RaizB(T),T); Refleja(Ti); InsertarHijoDrchaB(RaizB(T),Ti,T); Refleja(Td); InsertarHijoIzqdaB(RaizB(T),Td,T); } } Ejercicio n8: Escribir una funcin recursiva que encuentre el nmero de nodos de un rbol binario. //El algoritmo es muy sencillo considerando que el nmero de nodos de un rbol binario es el nmero de nodos del hijo a la izquierda ms el de su hijo a la derecha ms 1.

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); }

//Para calcular el nmero de nodos de un rbol T se hara mediante la llamada nmero (RaizB(T),T).
Ejercicio n9: Escribir una funcin recursiva que encuentre la altura de un rbol binario. //La altura de un rbol T es uno ms el mximo de alturas de los subrboles izquierdo y derecho(La altura de un rbol nulo est indefinida). #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)); }