// 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");
}