ARBOL_RECORRIDOS.c



// CREA UN ARBOL Y REALIZA SUS 3 RECORRIDOS
#include <stdio.h>
#include <stdlib.h>

struct Nodo
{
	int Dato;
	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;
	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");
}