Está en la página 1de 6

#include <stdio.h> #include <stdlib.

h>

/* estructura autoreferenciada */ struct nodoArbol { struct nodoArbol *ptrIzq; /* apuntador al subrbol izquierdo */ int dato; /* valor del nodo */ struct nodoArbol *ptrDer; /* apuntador al subrbol derecho */ }; /* fin de la estructura nodoArbol */

typedef struct nodoArbol NodoArbol; /* sinnimo de la estructura nodoArbol */ typedef NodoArbol *ptrNodoArbol; /* sinnimo de NodoArbol* */

/* prototipos */ void insertaNodo( ptrNodoArbol *ptrArbol, int valor ); void inOrden( ptrNodoArbol ptrArbol ); void preOrden( ptrNodoArbol ptrArbol ); void postOrden( ptrNodoArbol ptrArbol ); int profundidad (ptrNodoArbol ptrArbol, int nivel);

/* la funcin main comienza la ejecucin del programa */ int main() { int i; int valores[8] = {5,4,3,8,1,2,7,9}; //Los valores a insertar en el rbol ptrNodoArbol ptrRaiz = NULL; /* rbol inicialemnte vaco */

printf( "Los numeros colocados en el arbol son: \n" );

/* inserta valores en el rbol */ for(i=0;i<8;i++) { printf("%5d", valores[i]); insertaNodo( &ptrRaiz, valores[i] ); } getchar();

/* recorre el rbol en in inorden */ printf( "\n\nEl recorrido inorden es:\n" ); inOrden( ptrRaiz ); getchar();

/* recorre el rbol en preorden */ printf( "\n\nEl recorrido en preorden es:\n" ); preOrden( ptrRaiz ); getchar();

/* recorre el rbol en postOrden */ printf( "\n\nEl recorrido en postOrden es:\n" ); postOrden( ptrRaiz ); getchar();

return 0; /* indica terminacin exitosa */

} /* fin de main */

/* inserta un nodo dentro del rbol */ void insertaNodo( ptrNodoArbol *ptrArbol, int valor ) {

/* si el rbol esta vaco */ if ( *ptrArbol == NULL ) { *ptrArbol = malloc( sizeof( NodoArbol ) );

/* si la memoria est asignada, entonces asigna el dato */ if ( *ptrArbol != NULL ) { ( *ptrArbol )->dato = valor; ( *ptrArbol )->ptrIzq = NULL; ( *ptrArbol )->ptrDer = NULL; } /* fin de if */ else { printf( "no se inserto %d. No hay memoria disponible.n", valor ); } /* fin de else */

} /* fin de if */ else { /* el rbol no esta vaco */

/* el dato a insertar es menor que el dato en el nodo actual */

if ( valor < ( *ptrArbol )->dato ) { insertaNodo( &( ( *ptrArbol )->ptrIzq ), valor ); } /* fin de if */

/* el dato a insertar es mayor que el dato en el nodo actual */ else if ( valor > ( *ptrArbol )->dato ) { insertaNodo( &( ( *ptrArbol )->ptrDer ), valor ); } /* fin de else if */ } /* fin de else */

} /* fin de la funcin insertaNodo */

/* comienza el recorrido inorden del rbol */ void inOrden( ptrNodoArbol ptrArbol ) {

/* si el rbol no esta vaco, entonces recrrelo */ if ( ptrArbol != NULL ) { inOrden( ptrArbol->ptrIzq ); printf( "%5d", ptrArbol->dato ); inOrden( ptrArbol->ptrDer ); } /* fin de if */

} /* fin de la funcin inOrden */

/* comienza el recorrido preorden del rbol */

void preOrden( ptrNodoArbol ptrArbol ) {

/* si el rbol no esta vaco, entonces recrrelo */ if ( ptrArbol != NULL ) { printf( "%5d", ptrArbol->dato ); preOrden( ptrArbol->ptrIzq ); preOrden( ptrArbol->ptrDer ); } /* fin de if */

} /* fin de la funcin preOrden */

/* comienza el recorrido postOrden del rbol */ void postOrden( ptrNodoArbol ptrArbol ) {

/* si el rbol no esta vaco, entonces recrrelo */ if ( ptrArbol != NULL ) { postOrden( ptrArbol->ptrIzq ); postOrden( ptrArbol->ptrDer ); printf( "%5d", ptrArbol->dato ); } /* fin de if */

} /* fin de la funcin postOrden */

//calcula la profundidad del arbol

int profundidad (ptrNodoArbol ptrArbol, int nivel) { int p_izq, p_der; //si el arbol es NUll la profundidad es 0 if (ptrArbol==NULL) return 0; //en otro caso se llama recursivamente a la funcion profundidad,tanto por //el hijo derecho como por el izquierdo p_izq = profundidad (ptrArbol->ptrIzq,nivel+1); p_der = profundidad (ptrArbol->ptrDer,nivel+1); //comparacion de profundidades iaquierda y derecha if (p_izq>p_der) return p_izq;//se regresa la de mayor longitud return p_der; }

También podría gustarte