Universitario
Publicado el Viernes 07 de octubre de 2005 a las 18:31:14 por maxter
Votar: [pic][pic][pic][pic][pic]
[pic] 0 voto, 0%
Descargas: 3,336
Nombre: EJEMPLO DE ARBOLES
[pic]Descargar
Descripción:
ES UN DICCIONARIO DE ORTOGRAFIA EL CUAL GUARDA LAS PALABRAS EN UN ARBOL EL CUAL PODES RECORER DE VARIAS FORMASURL: http://mygnet.net/codigos/cplusplus/metodosdeordenacion/ejemplo_de_arboles.1001
Código Fuente:
#include
#include
#include
#include
#include
#define max 20 //el tama¤o de las palabras
#define ESC 0x1b //DEFINE LA TECLA ESC
int num_pal=0;
char resp;
typedef struct tipoceldaABB
{
struct tipoceldaABB *izq,*der,*arr;
char etiqueta[max];
int nivel;
} *nodoABB;
typedef nodoABB ABB;
ABBraiz=NULL;
//FUNCION QUE CREA LA RAIZ DEL ARBOL
ABB Crear(char et[max])
{
ABB raiz;
raiz = (ABB)malloc(sizeof(struct tipoceldaABB));
if (!raiz) //si falla malloc
{
printf("ERROR: Memoria Insuficiente.");
getch();
exit(0);
}
strcpy(raiz->etiqueta,et);
raiz->arr = NULL; //arriba de la raiz no hay nadie
raiz->izq =NULL; //a la izquierda de la raiz no hay nadie
raiz->der = NULL; //a la derecha de la raiz no hay nadie
raiz->nivel=0; //el nivel de la raiz es 0
num_pal++;
printf("SE AGREGO "%s" AL DICCIONARIO n",et);
return(raiz);
}
//RECIBE EL DATO A INSERTAR, LA RAIZ DEL ARBOL Y LA DIRECCION DEL NODO PADRE
void Inserta(char x[max], ABB *t,intniv,ABB *padre)
{
if(num_pal==0)
*t=Crear(x);
else
{
if(!(*t))
{
*t=(nodoABB)malloc(sizeof(struct tipoceldaABB));
if(!(*t)) //si falla malloc
{
printf("MEMORIA INSUFICIENTE nNO SE PUDO INSERTAR "%s" AL DICCIONARIO",x);
getch();
exit(0);
}
strcpy((*t)->etiqueta,x);
printf("SE AGREGO "%s" AL DICCIONARIO n",x);(*t)->arr=*padre;
(*t)->der=NULL;
(*t)->izq=NULL;
(*t)->nivel=niv;
num_pal++;
}
else
{
padre=t;
if( strcmpi(x,(*t)->etiqueta) == 0 )
{
printf("LA PALABRA "%s" YA EXISTE EN EL DICCIONARIO n",x);
getch();
}
if( strcmpi(x,(*t)->etiqueta) < 0 )
Inserta(x,&((*t)->izq),++niv,&(*padre));
else
if(strcmpi(x,(*t)->etiqueta) > 0 )
Inserta(x,&(*t)->der,++niv,&(*padre));
}
}//fin del else
}
//DEVUELVE UN PUNTERO EN DONDE SE ENCUENTRA EL MENOR ELEMENTO DEL ARBOL QUE RECIBE COMO PARAMETRO
ABB MENOR(ABB *p)
{
if((*p)->izq==NULL)
return(*p);
else
MENOR(&(*p)->izq);
}
//DISMINUYE EN UNO LOS NIVELES DE LOS NODOS DEL ARBOL PASADO COMO PARAMETROvoid REACOMODAR_NIVELES(ABB P)
{
if(P)
{
REACOMODAR_NIVELES(P->izq);
REACOMODAR_NIVELES(P->der);
P->nivel=P->nivel-1;
}
}
//RECIBE COMO PARAMETRO LA DIRECCION QUE SE QUIERE ELIMINAR
void ELIMINAR (ABB *TEMP)
{
ABB AUXILIAR;
if((*TEMP)->izq==NULL&&(*TEMP)->der==NULL)//si es una hoja
{
if((*TEMP)->arr->izq==(*TEMP))(*TEMP)->arr->izq=NULL;
else if((*TEMP)->arr->der==(*TEMP))
(*TEMP)->arr->der=NULL;
else if((*TEMP)->arr==NULL) //SI ES LA RAIZ EL UNICO ELEMENTO
raiz=NULL;
free((*TEMP));
num_pal--;
}
else
if((*TEMP)->der&&(*TEMP)->izq)//si tiene dos hijos
{
ABB P=MENOR(&(*TEMP)->der); //BUSCO EL MENOR ELEMENTO DEL SUBARBOL DERECHO...strcpy((*TEMP)->etiqueta,P->etiqueta); //Y LO SUSTITUYO POR EL NODO A ELIMINAR
ELIMINAR(&P); //ELIMINO EL NODO QUE SUSTITUI
}
else
if((*TEMP)->der)//si solo tiene hijo a la derecha
{
AUXILIAR= *TEMP;
*TEMP=(*TEMP)->der;
if(AUXILIAR->arr->izq==AUXILIAR)
AUXILIAR->arr->izq=*TEMP;
else if(AUXILIAR->arr->der==AUXILIAR)
AUXILIAR->arr->der=*TEMP;
...
Regístrate para leer el documento completo.