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