Aca esta el programa en donde inserta sin problemas 9000 nodos del 1 al 9 al arbol AVL, pero luego colocas imprimir en inorden y se queda pegado en 5000 y algo, o sino prueba buscando por ejemplo el 6000 y dice no esta, sin embargo colocas el 3000 y dice si esta.
Ojala puedas decirme a que se debe, para tener una base, yo creo que es a que no tiene memoria suficiente o no se, puede que este mala la funcion , pero no croe pk sino no funcionaria para los primeros 2000 o 3000
Código:
#include<stdio.h> #include<conio.h> #include<alloc.h> #include<stdlib.h> //*** constantes #define true 1 #define false 0 /////////////***** declaracion de estructuras a utilizar *****////////// struct nodo { int info; struct nodo *der; struct nodo *izq; int altura; }; typedef struct nodo *arbol; ///////////////***** declaracion de funciones *****////////////////////// void menu_insertar(arbol *a); void ingresar(arbol *a,int e); void menu_eliminar(arbol a); void balancear(arbol *a); void ActualizarAltura(arbol *a); int altura(arbol a); void rota_simple(arbol *a); void rota_doble(arbol *a); int max(int a,int b); void rotar_s(arbol *a,int bool); void rotar_d(arbol *a,int bool); int esta_arbin(arbol a, int elem); void inorden(arbol a); /////////////////////////////////////////////////////////////////////// void main() { arbol a; a=NULL; ///inicio arbol a en NULL menu_insertar(&a); menu_eliminar(a); } //////////////////////***** menu insertar *****////////////////////////////// void menu_insertar(arbol *a) { int op,elem,cont; cont=1; while(op!=2) { clrscr(); printf("M e n u I n s e r c i o n\n"); printf(" A r b o l A V L\n"); printf("1...Ingresar un Elemento.\n"); printf("2...VER RECORRIDO ARBOL Eliminar un Elemento\n\n"); printf("Elija Opcion: \n\n"); scanf("%i", &op); if(op==1) { while (cont<=9000) { //printf("Ingrese el Elemento: \n"); elem=cont; printf("%d \n",elem); ingresar(&(*a),elem); cont++; } } } } //////////////////***** ingresar en un arbol AVL ****/////////////////// void ingresar(arbol *a,int e) /////ingreso un elemento al arbol AVL { arbol aux; if (*a == NULL) { aux = (arbol) malloc(sizeof(nodo)); aux->info=e; aux->der=NULL; aux->izq=NULL; *a=aux; }else { if ((*a)->info < e) { ingresar(&((*a)->der),e); }else { if ((*a)->info > e) { ingresar(&((*a)->izq),e); } } } balancear(a); //funcion que comprueba cada vez que se inserta un elemento al arbol AVL si esta o no balanceado ActualizarAltura(a);//una vez balanceado se recalcula la altura de los subarboles } ////////////////////////////////////////////////////////////////////// void menu_eliminar(arbol a) { int e,c,opcion=7; while (opcion!=6) { clrscr(); printf("M e n u RECORRIDO\n"); printf(" A r b o l A V L\n\n"); printf( "OPCION\n"); printf("1- esta o no un elemento\n"); printf("2- Mostrar el recorrido del arbol AVL en inorden\n"); printf("3- Salir\n"); ("Opcion: "); scanf("%i",&opcion); if (opcion==1) { printf("Ingresa el elemento:"); scanf("%i",&e); if (esta_arbin(a,e)) printf("SI ESTA"); else printf("NO ESTA"); } getch(); if (opcion==2) { inorden(a); getch(); } if (opcion==3) { break; } } } ////////////////////////////////////////////////////////////////////////// void inorden(arbol a) ///imprime recorrido inorden en pantalla { //izq-raiz-der if (a!=NULL) { inorden(a->izq); printf("%i,",a->info); inorden(a->der); } } ///calcula la altura del subarbol a int altura(arbol a) { if(a==NULL){ return -1; }else{ return a->altura; } } ///////////////////////////////////////////////////////////////////////// void ActualizarAltura(arbol *a) { if(*a!=NULL){ (*a)->altura=max(altura((*a)->izq),altura((*a)->der))+1; } } ///////////////////////////////////////////////////////////////////////// int max(int a,int b) { if(a>b){ return a; }else{ return b; } } ///////////////////////////////////////////////////////////////////////// void balancear(arbol *a) { if(*a!=NULL){ if ((altura((*a)->izq) - altura((*a)->der))==2){//si esta desbalanceado a izquierda if(altura((*a)->izq->izq) >= altura((*a)->izq->der)){ rotar_s(a,true); }else{ rotar_d(a,true); } }else{ if (altura((*a)->der) - altura((*a)->izq)==2){ if(altura((*a)->der->der) >= altura((*a)->der->izq)){ rotar_s(a,false); }else{ rotar_d(a,false); } } } } } ///////////////////////////////////////////////////////////////////////// void rotar_s(arbol *a,int izq) { arbol aux; ////rotaciones simples if (izq){ aux=(*a)->izq; (*a)->izq=aux->der; aux->der=*a; }else{ aux=(*a)->der; (*a)->der=aux->izq; aux->izq=*a; } ActualizarAltura(a); ActualizarAltura(&aux); *a=aux; } ///////////////////////////////////////////////////////////////////////// void rotar_d(arbol *a,int izq) { ///rotaciones dobles if(izq){ rotar_s(&((*a)->izq),false); rotar_s(&(*a),true); }else{ rotar_s(&((*a)->der),true); rotar_s(&(*a),false); } } ////////***** Funcion q verifica si esta un elemento dado *****///////////// int esta_arbin(arbol a, int elem) { if(a==NULL) { return false; }else{ if(elem==a->info){ return true; }else{ return(esta_arbin(a->izq,elem)==true||esta_arbin(a->der,elem)==true); } } }