ARBOL_ALTURA.c



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

struct Nodo
{
	int Dato;
	struct Nodo *Raiz;
	struct Nodo *Izq;
	struct Nodo *Der;
};
struct Nodo *Raiz = NULL;
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;
}
// BLOQUE DE ROTACIONES
//===========================================================================
/*
CASO 1:										CASO 4:
		Nodo ConHijoIzq(Nodo k2)						Nodo ConHijoDer(Nodo k1)
		{												{
			Nodo k1 = k2->Izq;								Nodo k2 = k1->Der;
			k2->Izq = k1->Der;								k1->Der = k2->Izq;
			k1->Der = k2;									k2->Izq = k1;
			return k1;										return k2;
		}												}

CASO 2:										CASO 3:
		Nodo DobleConHijoIzq(Nodo k3)					Nodo DobleConHijoDer(Nodo k1)
		{												{
			k3->Izq = ConHijoDer(k3->Izq);						k1->Der = ConHijoIzq(k1->Der);
			return ConHijoIzq(k3);							return ConHijoDer(k1);
		}												}
*/
//===========================================================================


// BLOQUE DE RECORRIDOS
//===========================================================================
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 *Busca(struct Nodo *ARBOL, int Dato)
{
	if (ARBOL->Dato == Dato) return ARBOL;
	return (Dato > ARBOL->Dato) ? Busca(ARBOL->Der, Dato) : Busca(ARBOL->Izq, Dato);
}

int MAXIMO(int Altura1, int Altura2) { return (Altura1 > Altura2) ? Altura1 : Altura2; }
int Calcula_Altura(struct Nodo *NodoX)
{
	if (NodoX == NULL) return -1;
	return 1 + MAXIMO(Calcula_Altura(NodoX->Izq), Calcula_Altura(NodoX->Der));
}

void Ciclo_De_Operaciones( )
{
	int Opcion = 1, Dato=0;
	struct Nodo *ARBOL = Raiz;

	while ( Opcion )
	{
		printf("1.- Calcular Altura de un nodo\n");
		printf("2.- Muestra en Orden\n");
		printf("0.- Salir\n");
		printf("Seleccione una opcion: "); scanf("%d", &Opcion);
		switch ( Opcion )
		{
			case 0: return;
			case 1: printf("Introduce el nodo al que se le calcularA la altura: "); scanf("%d", &Dato);
					printf("La altura del nodo %d = %d", Dato, Calcula_Altura(Busca(ARBOL, Dato)));
					break;
			case 2:  Recorre_PREORDEN(ARBOL); 
		}
		printf("\n");
	}
}

void Pide_Datos()
{	int k, Datos[7] = {7,2,9,1,5,3,4};			// Cualquier dato
	for (k=0; k<7; k++) Almacena(Raiz, Crea_Nodo(Datos[k]));
}
int main() { Pide_Datos(); Ciclo_De_Operaciones( ); }