| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 06/02/2005 10:25 pm | | | Título: Arbol Binario de Busqueda !!! CODIGO COMPLETO AQUI !!! |
| Hola:
Aqui les dejo mi codigo ( que igualmente se lo pueden bajar de la seccion de Descargas--> Algoritmos de esta pagina ).
Incluye un Arbol Binario de Busqueda onc las Sig Caracteristicas:
-Insercion -Recorridos -Busquedas -Alturas -Nodos -Podar
---------------> DESCARGALO <----------------
| Código: | #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <ctype.h>
struct arbol { int dato; struct arbol *izq; struct arbol *der; }*raiz;
enum{ FALSO=0, VERDADERO };
/*PROTOTIPOS*/ void inicializar( void ); int vacio( struct arbol *hoja ); int eshoja( struct arbol *hoja ); struct arbol *insertar( struct arbol *raiz, struct arbol *hoja, int num ); int busqueda( struct arbol *hoja, int num ); int alturax( struct arbol *hoja, int num ); int alturafull( struct arbol *hoja, int *altura ); void auxaltura( struct arbol *hoja, int *altura, int cont ); int nodos( struct arbol *hoja ); void auxnodos( struct arbol *hoja, int *cont ); struct arbol *borrarx( struct arbol *hoja, int num ); struct arbol *podar( struct arbol *hoja ); void preorden( struct arbol *hoja ); void inorden( struct arbol *hoja ); void posorden( struct arbol *hoja ); void menu_recorridos( void ); void menu_busquedas( void ); void menu_alturas( void ); void menu_nodos( void ); void menu_podar( void );
void inicializar( void ) { raiz= NULL; }
int vacio( struct arbol *hoja ) { if( !hoja ) return VERDADERO; return FALSO; }
int eshoja( struct arbol *hoja ) { if( hoja->izq==NULL && hoja->der==NULL ) return VERDADERO; return FALSO; }
struct arbol *insertar( struct arbol *raiz, struct arbol *hoja, int num ) { if( !hoja ) { hoja= (struct arbol *) malloc( sizeof (struct arbol) ); hoja->dato= num; hoja->izq= NULL; hoja->der= NULL; if( !raiz ) return hoja; else if( num<raiz->dato ) raiz->izq= hoja; else raiz->der= hoja; return hoja; } else if( num<hoja->dato ) insertar( hoja, hoja->izq, num ); else insertar( hoja, hoja->der, num ); return raiz; }
int busqueda( struct arbol *hoja, int num ) { while( hoja ) { if( num==hoja->dato ) return VERDADERO; else { if( num<hoja->dato ) hoja= hoja->izq; else hoja= hoja->der; } } return FALSO; }
int alturax( struct arbol *hoja, int num ) { int altura=1;
while( hoja ) { if( num==hoja->dato ) return altura; else { altura++; if( num<hoja->dato ) hoja= hoja->izq; else hoja= hoja->der; } } return FALSO; }
int alturafull( struct arbol *hoja, int *altura ) { auxaltura( hoja, altura, 1 ); return *altura; }
void auxaltura( struct arbol *hoja, int *altura, int cont ) { if( !hoja ) return;
auxaltura( hoja->izq, altura, cont+1 ); auxaltura( hoja->der, altura, cont+1 ); if( (eshoja( hoja ) && cont)>*altura ) *altura= cont; }
int nodos( struct arbol *hoja ) { int nodos=0; auxnodos( hoja, &nodos ); return nodos; }
void auxnodos( struct arbol *hoja, int *cont ) { if( !hoja ) return;
(*cont)++; auxnodos( hoja->izq, cont ); auxnodos( hoja->der, cont ); }
struct arbol *borrarx( struct arbol *hoja, int num ) { if( hoja->dato==num ) { struct arbol *p, *p2;
if( vacio( hoja ) ) { free( hoja ); hoja= NULL; return hoja; } else if( hoja->izq==NULL ) { p= hoja->der; free( hoja ); return p; } else if( hoja->der==NULL ) { p= hoja->izq; free( hoja ); return p; } else { p= hoja->der; p2= hoja->der; while( p->izq ) p= p->izq; p->izq= hoja->izq; free( hoja ); return p2; } } else if( num<hoja->dato ) hoja->izq= borrarx( hoja->izq, num ); else hoja->der= borrarx( hoja->der, num ); return hoja; }
struct arbol *podar( struct arbol *hoja ) { if( !hoja ) return hoja;
podar( hoja->izq ); podar( hoja->der ); free( hoja ); hoja= NULL; return hoja; }
/*Recorridos*/
void preorden( struct arbol *hoja ) { if( !hoja ) return;
printf( "%i ", hoja->dato ); preorden( hoja->izq ); preorden( hoja->der ); }
void inorden( struct arbol *hoja ) { if( !hoja ) return;
inorden( hoja->izq ); printf( "%i ", hoja->dato ); inorden( hoja->der ); }
void posorden( struct arbol *hoja ) { if( !hoja ) return;
posorden( hoja->izq ); posorden( hoja->der ); printf( "%i ", hoja->dato ); }
/*Menus del Arbol*/ void menu_recorridos( void ) { char _op='S';
while( _op!='4' ) { clrscr(); printf( "1. PreOrden." ); printf( "\n2. InOrden." ); printf( "\n3. PosOrden." ); printf( "\n4. Salir." ); printf( "\n\n:: " ); _op= getch(); switch( _op ) { case '1': preorden( raiz ); getch(); break; case '2': inorden( raiz ); getch(); break; case '3': posorden( raiz ); getch(); break; } } return; }
void menu_busquedas( void ) { int val;
printf( "\n\nNumero: " ); scanf( "%i", &val ); if( busqueda( raiz, val ) ) printf( "\n\nEncontrado.." ); else printf( "\n\nError, No se encuentra." ); getch(); }
void menu_alturas( void ) { char _op='A'; int val, altura;
while( _op!='3' ) { clrscr(); printf( "1. Altura de Un Nodo \( Profundidad \). " ); printf( "\n2. Altura de Todo el Arbol." ); printf( "\n3. Salir." ); printf( "\n\n:: " ); _op= getch(); switch( _op ) { case '1': printf( "\n\nNumero: " ); scanf( "%i", &val ); altura= alturax( raiz, val ); if( !altura ) printf( "\n\nImposible, numero inexistente." ); else printf( "\n\nLa Altura es: %i", altura ); getch(); break; case '2': altura= 0; printf( "\n\nLa Altura del Arbol es: %i", alturafull( raiz, &altura ) ); getch(); break; } } return; }
void menu_nodos( void ) { printf( "\n\nEl Numero de Nodos es: %i", nodos( raiz ) ); getch(); }
void menu_podar( void ) { char _op='A'; int val;
while( _op!='3' ) { clrscr(); printf( "1. Podar Un Nodos del Arbol." ); printf( "\n2. Podar Todo el Arbol." ); printf( "\n3. Salir." ); _op= getch(); switch( _op ) { case '1': printf( "\n\nNumero: " ); scanf( "%i", &val ); raiz= borrarx( raiz, val ); printf( "\n\n.... Borrado ...." ); break; case '2': raiz= podar( raiz ); printf( "\n\nArbol Borrado por Completo." ); getch(); break; } } return; }
int main() { char _op='A'; int val;
inicializar();
while( _op!='S' ) { clrscr(); printf( "Insertar." ); printf( "\nRecorridos." ); printf( "\nBusquedas." ); printf( "\nAlturas." ); printf( "\nNodos." ); printf( "\nPodar." ); printf( "\nSalir." ); printf( "\n\n:: " ); _op= toupper( getch() ); switch( _op ) { case 'I': printf( "\n\nNumero: " ); scanf( "%i", &val ); if( busqueda( raiz, val ) ) { printf( "\n\nEste numero ya ha sido insertado." ); getch(); break; } raiz= insertar( raiz, raiz, val ); break; case 'R': if( vacio( raiz ) ) { printf( "\n\nEl Arbol Aun esta Vacio." ); getch(); break; } menu_recorridos(); break; case 'B': if( vacio( raiz ) ) { printf( "\n\nEl Arbol Aun esta Vacio." ); getch(); break; } menu_busquedas(); break; case 'A': if( vacio( raiz ) ) { printf( "\n\nEl Arbol Aun esta Vacio." ); getch(); break; } menu_alturas(); break; case 'N': if( vacio( raiz ) ) { printf( "\n\nEl Arbol Aun esta Vacio." ); getch(); break; } menu_nodos(); break; case 'P': if( vacio( raiz ) ) { printf( "\n\nEl Arbol Aun esta Vacio." ); getch(); break; } menu_podar(); break; } } printf( "\n\nPulsa para salir..." ); getchar(); return 0; }
|
byeeeeeee _________________
|
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 10/02/2005 11:13 pm | | | Título: |
| Hola:
No descargen el archivo de Arboles Binarios de Busqueda que se encuentra en la seccion de Descargas de esta web, porke al parecer el espacio que tenia me lo dieorn de baja.... solo pueden trabajar con el codigo que postie aqui mismo y ademas proximamente lo podran descargar de o simplemente dandole click al DESCARGAR que se encuentra al inicio de ESTE POST.
Cualquier Comentario, aportacion o duda es bien recivida .
byeee _________________
|
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 26/02/2005 12:01 pm | | | Título: |
| Hola:
En esta semana colgare el codigo de Arbol Balanceado AVL.
NOTA: estaba tentando la posibilidad de pegar el Codigo + Explicacion paso a paso para la realizacion, dejando a un lado CONCEPTOS Basicos y eso, solo la explicacion y logica del codigo para la realizacion del Arbol AVL. Pero nose, necesito sus comentarios para ver si valdra la pena el esfuerzo . Ahi me postean !!
byeeeeeeeee _________________
|
| | Volver arriba | |  | | soloc
Registrado: 25 Ene 2005 Mensajes: 212 Ubicación: Bolivia
| Publicado: 01/03/2005 6:10 am | | | Título: |
| Toda la informacion que envies es de valor...
salu2 |
| | Volver arriba | |  | txaby
Registrado: 13 Mar 2005 Mensajes: 2
| Publicado: 13/03/2005 5:47 pm | | | Título: |
| | ei Diabliyo, te loas currao! merci |
| | Volver arriba | |  | txaby
Registrado: 13 Mar 2005 Mensajes: 2
| Publicado: 14/03/2005 3:36 am | | | Título: |
| | ombre, si lo pusieras mejor q mejor, no? xD |
| | Volver arriba | |  | | donguaren
Registrado: 16 Jun 2005 Mensajes: 16
| Publicado: 25/06/2005 7:25 pm | | | Título: |
| no me compila, me tira 5 veces el mismo error: [Linker error] undefined reference to `clrscr' 5 veces ld returned 1 exit status |
| | Volver arriba | |  | donguaren
Registrado: 16 Jun 2005 Mensajes: 16
| Publicado: 25/06/2005 7:26 pm | | | Título: |
| no me compila, me tira 5 veces el mismo error: [Linker error] undefined reference to `clrscr' 5 veces ld returned 1 exit status
uso el dev-c++ en C |
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 25/06/2005 11:34 pm | | | Título: |
| Hola:
donguaren, nose como es posible que te atrevas a compilar un codigo de esta complejidad, tomando en cuenta tu bajo nivel :S.... lo siento por lo feo que se lee, pero es la verdad...
Tu error mas que nada esta FACILIZIMO, pero no le veo nada bueno el decirte la respuesta ya que no te esmeras tu mismo ..
byee _________________
|
| | Volver arriba | |  | | pitukilloloco
Registrado: 11 May 2005 Mensajes: 442
| Publicado: 26/06/2005 3:04 am | | | Título: |
| Me parece excelente que pongas en el foro programas para todos lo lectores de este foro y siempre son bienvenidas esta clase de aportaciones, pero estoy en desacuerdo con tu comentario sobre donguaren, ya que el programa que pusiste utiliza la librería <conio.h> la cual no es estándar y originalmente viene de los compiladores de la compañía Borland, pero debido a su popularidad también la soportan los compiladores de Microsoft (aunque no todas las funciones, ya que por ejemplo la función gotoxy no viene en los de Visual C++). El compilador que usa donguaren, el Dev C++ también la soporta pero no viene en el paquete original y hay que bajarse el fuente de la librería y compilarla para que funcione. Esta es una liga de donde puede bajarse esta libería
Creo que para una mejor ayuda a todos los lectores, cuando se ponga un programa en el foro hay que indicar si este usa sólo librerías estándar y en caso de no ser así o no estar seguro, hay que poner qué compilador usamos y bajo que sistema operativo. |
| | Volver arriba | |  | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 26/06/2005 12:13 pm | | | Título: |
| Hola:
pitukilloloco con todo respeto compa.... como veo TU SI SABES el porke... pero dime a ke se debe eso de ke tu sepas el porke de ese error ???.... por tus conocimientos, errores y experiencias verdad ???...... Entonces dime, si tuvieras una experiencia nula o baja te atreverias a tratar de revisar cosas que no van con tu nivel ??....
" Cada kien con su cada cual "..... un buen consejo esque mejor siga estudiando porke este tipo de codigos aun no los va a comprender 
No es una mala criticia sino que aprendamos a avanzar a pasos normales, no queramos VOLAR cuando apenas caminas 
byeee _________________
|
| | Volver arriba | |  | donguaren
Registrado: 16 Jun 2005 Mensajes: 16
| Publicado: 26/06/2005 7:24 pm | | | Título: |
| | Diabliyo escribió: | Hola:
donguaren, nose como es posible que te atrevas a compilar un codigo de esta complejidad, tomando en cuenta tu bajo nivel :S.... lo siento por lo feo que se lee, pero es la verdad...
Tu error mas que nada esta FACILIZIMO, pero no le veo nada bueno el decirte la respuesta ya que no te esmeras tu mismo ..
byee |
el codigo me sirve para un trabajo, ya que es justamente lo que tengo que usar, pero escribir todo eso es un cacho. No costaba nada el decir el por qué del error, o acaso naciste con una mano en la boca y la otra en un manual? Todos parten desde 0, y la verdad me importa un huevo aprender esto, sino que hago lo necesario para pasar un ramo. Eso es todo.
En vez de haber contestado como caballero, ya que tienes un alto nivel, como tu lo dices, quedaste como un pobre tipo que se cree superior al resto por el hecho de dominar una materia.
PD: y sí, averigué qué era lo que tenia malo. |
| | Volver arriba | |  | | Diabliyo
Registrado: 14 Abr 2004 Mensajes: 346 Ubicación: En la Luna
| Publicado: 28/06/2005 7:03 pm | | | Título: |
| Hola:
jajajaj...... pues buen provecho y que seas un buen ing o lic. y de antemano empeze desde 0, pero una cosa es saber Ignorantemente y otra es SABER por gusto ...
Sobre la repsuesta, pues es casi IMPOSIBLE que no supieras resolver el error, osea.... es imposible que si NOs abes corregir el error, pues es ovio que nisiquiera sabrias el funcionamiento, correcto y logico dle programa...
Y contesto como hombre de mexico que soy !!!
byeee _________________
|
| | Volver arriba | |  | Garrett
Registrado: 04 Ago 2005 Mensajes: 5
| Publicado: 05/08/2005 5:26 pm | | | Título: Respuestas |
| | Pues, pienso que la idea principal de los foros es compartir opiniones además de ayudar a quellos que lo solicitan, en el caso del código citado, se ve que es de un nive muy principiante, pero no por eso tenemos que burlarnos del conocimiento de los demas, solo digo que si colocamos un código,y nos postean, contestemos bien y yá, si no podemos, dejemos que alguien lo haga y listo, no ofendemos a nadie. |
| | Volver arriba | |  | Valmir
Registrado: 06 Ago 2005 Mensajes: 20
| Publicado: 08/08/2005 12:07 am | | | Título: |
| Una pregunta, he estado mirando tu codigo y hay una comprobacion que no entiendo porque la haces:
struct arbol *borrarx( struct arbol *hoja, int num ) { if( hoja->dato==num ) { struct arbol *p, *p2;
if( vacio( hoja ) ) { free( hoja ); hoja= NULL; return hoja; } .....
yo creo que si llegas al if esa condicion siempre sera falsa ya que si fuera verdadera seria porque hoja=0, con lo que ya habria dado un error de ejecucion en la sentencia hoja->dato==num
Quiero decir que yo programo en C en linux y compilo con el gcc, asi que si en otro sistema operativo o compilador funciona lo siento por poner una pregunta inapropiada.
Saludos |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |