Universitario

Páginas: 5 (1200 palabras) Publicado: 1 de octubre de 2012
EJEMPLO DE ARBOLES
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;

 ...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Universitario
  • Universitarios
  • Universitario
  • Universitario
  • Universitario
  • Universitario
  • Universitario
  • Universitario

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS