lunes, 26 de noviembre de 2007

ReCoRrIdOdEuNaRbOl


//crea un arbol binario y lo recorre en
//preorden, inorden, y en posorden
#include {stdio.h}
#include {stdlib.h}
#include {time.h}

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

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

//prototipos
void insertaNodo( ptrNodoArbol *ptrArbol, int valor ) ;
void inOrden( ptrNodoArbol ptrArbol ) ;
void preOrden( ptrNodoArbol ptrArbol ) ;
void posOrden( ptrNodoArbol ptrArbol ) ;

//la funcion main comienza la ejecucion del programa
int main()
{
int i ; //contador para el ciclo 1 a 10
int elemento ; //variable para almacenar valores al azar
ptrNodoArbol ptrRaiz = NULL ; //arbol inicialmente vacio

srand ( time( NULL ) ) ;
printf("Los numeros colocados en elarbol son:\n") ;

//inserta valores al azar entre 1 y 15 en el arbol
for( i = 1 ; i <= 10 ; i++ ) {
elemento = rand() % 15 ;
printf("%3d",elemento) ;
insertaNodo( &ptrRaiz, elemento) ;
}
//recorre el arbol en preorden
printf("\n\nEl recorrido en preorden es:\n") ;
preOrden( ptrRaiz ) ;

//recorre el arbol en inorden
printf("\n\nEl recorrido en inorden es:\n") ;
preOrden( ptrRaiz ) ;

//recorre el arbol en posorden
printf("\n\nEl recorrido en posorden es:\n") ;
preOrden( ptrRaiz ) ;
printf("\n\n") ;
system("PAUSE") ;

return 0 ; //indica termonacion exitosa

}//fin del main

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

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

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

//el dato a insertar es menor que el dato en el nodo actual
if( valor < ( *ptrArbol )-> dato ){
insertaNodo( &( ( *ptrArbol)->ptrIzq ), valor ) ;
}//fin del if

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

}//fin del else

}//fin de la funcion insertaNodo

//comienza el recorrido de la funcion inOrden
void inOrden( ptrNodoArbol ptrArbol ){

//si el arbol no esta vacio, entonces recorrelo
if( ptrArbol != NULL ){
inOrden( ptrArbol->ptrIzq ) ;
printf("%3d",ptrArbol->dato) ;
inOrden( ptrArbol->ptrDer ) ;
}//fin del if

}//fin de la funcion inOrden

//comienza el recorrido de la funcion preOrden
void preOrden( ptrNodoArbol ptrArbol ){

//si el arbol no esta vacio, entonces recorrelo
if( ptrArbol != NULL ){
printf("%3d",ptrArbol->dato) ;
preOrden( ptrArbol->ptrIzq ) ;
preOrden( ptrArbol->ptrDer ) ;
}//fin del if

}//fin de la funcion preOrden

//comienza el recorrido de la funcion posOrden
void posOrden( ptrNodoArbol ptrArbol ){

//si el arbol no esta vacio, entonces recorrelo
if( ptrArbol != NULL ){
posOrden( ptrArbol->ptrIzq ) ;
posOrden( ptrArbol->ptrDer ) ;
printf("%3d",ptrArbol->dato) ;

}//fin del if

}//fin de la funcio posOrden

No hay comentarios: