#include #include #include #include #include #include struct nodo { int dato; struct nodo *padre; struct nodo *hi; struct nodo *hd; }; int ARBOL_VACIO (struct nodo *); void INI_ARBOL (struct nodo **); void INS_ARBOL (struct nodo **, int); int PROFUNDIDAD (struct nodo *); void ELIMINAR_NODO (struct nodo **, struct nodo *); void LISTAR_IRD(struct nodo *); struct nodo* BUSCAR_NODO(struct nodo*,int); void main (void) { int d; struct nodo *arbol; INI_ARBOL(&arbol); clrscr(); while (d!=0){ printf ("\nNumero: "); cin >> d; if (d!=0) INS_ARBOL(&arbol, d); } printf("Presione ENTER para continuar, ESC finaliza.\n"); printf ("\nListado del  rbol:"); printf ("\n------------------\n"); LISTAR_IRD(arbol); printf ("\n------------------\n"); cout << "\nLa profundidad del  rbol es " << PROFUNDIDAD(arbol); printf("\nLado Izquierdo-> %d", PROFUNDIDAD(arbol->hi)); printf("\tLado Derecho-> %d", PROFUNDIDAD(arbol->hd)); printf("\n Raiz: %d",arbol->dato);getch(); getch(); int victima; while (!ARBOL_VACIO(arbol)) { printf("\nIntroduce un nodo a eliminar: "); cin >> victima; ELIMINAR_NODO(&arbol,BUSCAR_NODO(arbol,victima)); printf ("\nListado del  rbol:"); printf ("\n------------------\n"); LISTAR_IRD(arbol); printf ("\n------------------\n"); cout << "\nLa profundidad del  rbol es " << PROFUNDIDAD(arbol); printf("\nLado Izquierdo-> %d", PROFUNDIDAD(arbol->hi)); printf("\tLado Derecho-> %d", PROFUNDIDAD(arbol->hd)); if (arbol!=NULL) printf("\n Raiz: %d",(arbol->dato));getch(); getch(); } free (arbol); } int ARBOL_VACIO(struct nodo *p) { return (p == NULL); } void INI_ARBOL(struct nodo **p) { *p = NULL; } void INS_ARBOL(struct nodo **p, int n) { struct nodo *aux; struct nodo **q; int sw; if ((aux = (struct nodo*) malloc (sizeof (struct nodo)))== NULL) exit(1); aux->dato = n; if (ARBOL_VACIO(*p)) { aux->hi = NULL; aux->hd = NULL; aux->padre = aux; *p = aux; } else { sw = 1; q = p; while (sw) { sw = 0; if ((*q)->dato <= n && (*q)->hd != NULL) { q = &(*q)->hd; sw = 1; } if ((*q)->dato >= n && (*q)->hi != NULL) { q = &(*q)->hi; sw = 1; } } aux->hi = aux->hd = NULL; aux->padre = (*q); ((*q)->dato < n) ? (*q)->hd = aux : (*q)->hi = aux; } } int PROFUNDIDAD(struct nodo *p) { int nivelhi=0; int nivelhd=0; if (p != NULL) { nivelhi++; nivelhi+=PROFUNDIDAD(p -> hi); nivelhd++; nivelhd+=PROFUNDIDAD(p -> hd); } return (nivelhd > nivelhi) ? nivelhd : nivelhi; } void ELIMINAR_NODO (struct nodo **p, struct nodo *q) { if (q==NULL) printf("Error. Se ha intentado eliminar un nodo NO EXISTENTE."); else { if (q->hd == NULL && q->hi == NULL && q->padre != q) { // ES HOJA if ((q->padre)->hd == q) (q->padre)->hd = NULL; // ES UN HD else (q->padre)->hi = NULL; // ES UN HI } // fin del if si es hoja else { if ((q->padre) == q && q->hd == NULL && q->hi == NULL)// RAIZ SIN HIJOS *p = NULL; else { if (q->hd != NULL && q->hi == NULL) {// NO TIENE HI if (q->padre==q) *p=q->hd; else if ((q->padre)->hd == q) // ES UN HD (q->padre)->hd = q->hd; else (q->padre)->hi = q->hd; // ES UN HI } // fin del if no tiene HI else { if (q->hd == NULL && q->hi != NULL) {// NO TIENE HD if (q->padre==q) *p=q->hi; else if ((q->padre)->hd == q) (q->padre)->hd = q->hi; else (q->padre)->hi = q->hi; } // fin del if no tiene hd else { if (q->hd != NULL && q->hi != NULL){ //TIENE 2 HIJOS struct nodo *aux = NULL; if (PROFUNDIDAD(q->hi) > (PROFUNDIDAD (q->hd))) { aux=q->hi; while (aux->hd != NULL) {aux = aux->hd;} } else { aux=q->hd; while (aux->hi != NULL) {aux = aux->hi;} } struct nodo *nodotmp = NULL; if ((nodotmp = (struct nodo*) malloc (sizeof (struct nodo)))==NULL){ printf ("\nError Memory Allocation !!"); printf ("\nNo hay memoria suficiente, abortando ..."); exit(1); } nodotmp->dato = aux->dato; if (q->hd == aux) nodotmp->hd = aux->hd; else nodotmp->hd = q->hd; if (q->hi == aux) nodotmp->hi = aux->hi; else nodotmp->hi = q->hi; if ((q->padre)==q){ // ES RAIZ *p = nodotmp; nodotmp->padre=nodotmp; } else if ((q->padre)->hd == q) {// ES UN HD (q->padre)->hd = nodotmp; nodotmp->padre=q->padre; } else { (q->padre)->hi = nodotmp; // ES UN HI nodotmp->padre=q->padre; } ELIMINAR_NODO(p, aux); } // fin del if } // fin del else } // fin del else } // fin del else } // fin del else } // fin del else free (q); } // fin de la funcion eliminar_nodo void LISTAR_IRD(struct nodo *p){ if (p!=NULL){ LISTAR_IRD(p->hi); printf("%d ",p->dato); LISTAR_IRD(p->hd); } } struct nodo* BUSCAR_NODO(struct nodo *p,int n){ if (p==NULL || n==p->dato) return p; else if (ndato) return (BUSCAR_NODO(p->hi,n)); else return (BUSCAR_NODO(p->hd,n)); }