// CREA Y BORRA NODOS DE UN ARBOL CUIDANDO SU BALANCEO #include <stdio.h> #include <stdlib.h> struct Nodo { int Dato; int FE, FE_Izq, FE_Der; // FE = Factor de Equilibrio, FE_Izquierdo, FE_Derecho struct Nodo *Raiz; struct Nodo *Izq; struct Nodo *Der; }; struct Nodo *Raiz = NULL; void Recorre_PREORDEN(struct Nodo *ARBOL) { printf("%d ", ARBOL->Dato); if (ARBOL->Izq != NULL) Recorre_PREORDEN(ARBOL->Izq); if (ARBOL->Der != NULL) Recorre_PREORDEN(ARBOL->Der); } void Recorre_POSORDEN(struct Nodo *ARBOL) { if (ARBOL->Izq != NULL) Recorre_POSORDEN(ARBOL->Izq); if (ARBOL->Der != NULL) Recorre_POSORDEN(ARBOL->Der); printf("%d ", ARBOL->Dato); } void Recorre_ENTREORDEN(struct Nodo *ARBOL) { if (ARBOL->Izq != NULL) Recorre_ENTREORDEN(ARBOL->Izq); printf("%d ", ARBOL->Dato); if (ARBOL->Der != NULL) Recorre_ENTREORDEN(ARBOL->Der); } void Almacena(struct Nodo *ARBOL, struct Nodo *Nuevo) { if (Raiz == NULL) { Raiz = Nuevo; return; } if (Nuevo->Dato > ARBOL->Dato) { if (ARBOL->Der == NULL) { ARBOL->Der = Nuevo; Nuevo->Raiz = ARBOL; return; } else Almacena(ARBOL->Der, Nuevo); } else // ARBOL IZQUIERDO { if (ARBOL->Izq == NULL) { ARBOL->Izq = Nuevo; Nuevo->Raiz = ARBOL; return; } else Almacena(ARBOL->Izq, Nuevo); } } struct Nodo *Crea_Nodo(int Dato) { struct Nodo *Nuevo = (struct Nodo *)malloc(sizeof(struct Nodo)); Nuevo->Raiz = Nuevo->Der = Nuevo->Izq = NULL; Nuevo->Dato = Dato; Nuevo->FE = Nuevo->FE_Izq = Nuevo->Der = 0; return Nuevo; } void Pide_Datos() { int Dato; // Cualquier dato do { printf("Introduce un dato: "); scanf("%d", &Dato); if (Dato) Almacena(Raiz, Crea_Nodo(Dato)); } while (Dato); } int main() { Pide_Datos(); printf("PRE-ORDEN: "); Recorre_PREORDEN(Raiz); printf("\n"); printf("ENTRE-ORDEN: "); Recorre_ENTREORDEN(Raiz); printf("\n"); printf("POS-ORDEN: "); Recorre_POSORDEN(Raiz); printf("\n"); }