Logo elrincondelc.com
curso de programación en c
Foros de programación en C
Inicio :: Código fuente
Usuario: Clave: Regístrate

Valoración
37

Arbol Binario De Busqueda

codigo enviada por: kropzter (2007-04-13 16:26:03)
El programa genera un arbol binario, captura caracteres y los introduce en el arbol, despues muestra los recorridos en preorden, inorden y postorden. Maneja memoria dinamica!!!
//PROGRAMA QUE CAPTURA UNA CADENA DE CARACTERES DE MAXIMO 200 ELEMENTOS Y
//CREA UN ARBOL DE BUSQUEDA CON LOS CARACTERES DE LA CADENA Y REALIZA RECORRIDOS
// EN PREORDEN,ENTREORDEN Y POSTORDEN.

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

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
struct nodoarbol{                        //ESTRUCTURA DEL ARBOL
	struct nodoarbol *izqnodo;
	int info;
	struct nodoarbol *dernodo;
	};
typedef struct nodoarbol NODO;    //DEFINICION DE TIPO NODO
typedef NODO *ARBOL;               //DECLARACION DE VARIABLE PUNTERO A NODO

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void insertanodonuevo(ARBOL *,int);    //DECLARACION DE FUNCIONES
void inorden(ARBOL);
void preorden(ARBOL);
void postorden(ARBOL);
void treefree(ARBOL);
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/

/*-----------------------<FUNCION PRINCIPAL>--------------------------------*/


main(){
int i;                          //CONTADOR
char newnod,chain[200],elementos;    //DECLARACION DE CADENA,BANDERA Y VARIABLE QUE CONTIENE EL NUEVO VALOR A INSERTAR EN EL ARBOL
clrscr();
ARBOL raiz=NULL;                //DECLARACION DE VARIABLE DE TIPO ARBOL
printf("\n\n\tIntroduzca una cadena de caracteres (max. 200 elementos):\n");
gets(chain);
elementos=strlen(chain);         //CHECA EL TAMA¥O DE LA CADENA Y ESTABLECE EL NUMERO DE NODOS DEL ARBOL
for(i=1;i<=elementos;i++)  {
       newnod=chain[i-1];
     insertanodonuevo(&raiz,newnod);

}
printf("\n\n preorden ¯¯\t");
preorden(raiz);                 //LLAMADO A FUNCION DE RECORRIDO EN PREORDEN
printf("\n\n inorden  ¯¯\t");
inorden(raiz);                  //LLAMADO A FUNCION DE RECORRIDO EN INORDEN
printf("\n\n postorden ¯¯\t");
postorden(raiz);                //LLAMADO A FUNCION DE RECORRIDO EN POSTORDEN
getch();
treefree(raiz);            //LIBERACION DE MEMORIA DEL ARBOL.
raiz=NULL;		  //ASIGNACION DE UN VALOR NULO A LA RAIZ.
return 0;
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
/*-CREA UN NUEVO NODO Y COLOCA LOS VALORES DEL NUEVO ELEMENTO EN LA POSICION CORRESPONDIENTE */

void insertanodonuevo(ARBOL *rarbol,int nuevo){
 if(*rarbol==NULL){                          //CREACION DE UN NUEVO NODO
 *rarbol=(NODO *)malloc(sizeof(NODO));
 if(*rarbol!=NULL){
	    //ASIGNACION DE VALORES NUEVOS EN EL NODO NUEVO
 (*rarbol)->info=nuevo;
 (*rarbol)->izqnodo =NULL;
 (*rarbol)->dernodo=NULL;
 }
 else{printf("\n­­­­ Memoria No Disponible !!!!\n");}
 }
 else
	if(nuevo<(*rarbol)->info)  //checa si el elemento nuevo es mayor que el elemento padre
		insertanodonuevo(&((*rarbol)->izqnodo),nuevo);  //coloca el elemento a la izquierda del padre o raiz
	else
		if(nuevo>(*rarbol)->info)  //checa si el elemento nuevo es menor que el elemento padre
			insertanodonuevo(&((*rarbol)->dernodo),nuevo);  //coloca el elemento a la derecha del padre o raiz
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//FUNCION ITERATIVA LA CUAL RECORRE EL ARBOL IMPRIMIENDO SIEMPRE EL VALOR
//QUE CONTIENE LA RAIZ,DESPUES LA RAMA IZQUIERDA,LUEGO LA RAMA DERECHA,SIEMPRE
//Y CUANDO LA RAIZ SEA DIFERENTE DE UN VALOR NULO, SI ES NULO SALTA A LA SIGUIENTE INSTRUCCION.
void preorden(ARBOL rarbol){
if(rarbol!=NULL){
printf(" %c ",rarbol->info);
preorden(rarbol->izqnodo);
preorden(rarbol->dernodo);

}
}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//FUNCION ITERATIVA LA CUAL RECORRE EL ARBOL BUSCANDO EL NODO MAS IZQUIERDO
//QUE CONTIENE EL ARBOL O SEA HASTA QUE LA RAMA DEL ULTIMO NODO SEA NULO,LUEGO LA IMPRIME,DESPUES
//DESPUES LA RAIZ DEL SUB-ARBOL,Y LUEGO EL NODO DE LA DERECHA.

void inorden(ARBOL rarbol){
if(rarbol!=NULL){
inorden(rarbol->izqnodo);
printf(" %c ",rarbol->info);
inorden(rarbol->dernodo);

}

}
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//FUNCION ITERATIVA LA CUAL RECORRE EL ARBOL BUSCANDO EL NODO QUE ESTA MAS A LA IZQUIERDA
//LUEGO EL NODO DE LA DERECHA Y LUEGO LA RAIZ DE ESE SUB-ARBOL
void postorden(ARBOL rarbol){
if(rarbol!=NULL){
postorden(rarbol->izqnodo);
postorden(rarbol->dernodo);
printf(" %c ",rarbol->info);
}
}
/**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
//FUNCION ITERATIVA IDENTICA AL RECORRIDO EN POSTORDEN LA UNICA DIFERENCIA
//ES QUE EN VEZ DE IMPRIMIR EN PANTALLA EL VALOR DE UN NODO ESTE ES
//ELIMINADO DEL ARBOL LIBERANDO LA MEMORIA CON LA FUNCION free(), ELEGI ESTA
//FORMA YA QUE SE ELIMINA PRIMERO LOS NODOS HIJO DE EL SUB-ARBOL Y LUEGO LA RAIZ
//YA QUE SI SE ELIMINA LA RAIZ PRIMERO, LOS DATOS DE LOS HIJOS SE DESCONECTAN
//DEL ARBOL PERO LA MEMORIA QUE OCUPABAN SIGUE SIENDO UTILIZADA Y DE ESTA FORMA
//SE ELIMINA EL ARBOL DE ABAJO HACIA ARRIBA (O SEA DE LOS HIJOS A LA RAIZ).

void treefree(ARBOL rarbol){
if(rarbol!=NULL){
treefree(rarbol->izqnodo);
treefree(rarbol->dernodo);
free(rarbol);
}
}

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/


/*********************************************»
°   PROGRAMA ELABORADO EN COMPILADOR:         °
°  		 TURBO C++                    °
°   	       VERSION 3.0                    °
°         BORLAND INTERNATIONAL               °
°---------------------------------------------°
°            CODIGO FUENTE POR:               °
°      DANIEL ALBERTO RIVERA PERALES.         °
°            MATRICULA.- 185154               °
°	         GRUPO: 4§K                   °
È**********************************************/


/*********************************************»
°   Cualquier duda o comentario sobre este    °
°   programa por favor mandarlo a mi correo   °
°   electronico.                              °
°    ->    kropzter@yahoo.com                 °
°    ->    a185154@uach.mx                    °
°                                             °
È**********************************************/
No entiendo demasiados conceptos de los que ayi salen.... ahora nos pasaran en la unvieridad busqueda binaria, arboles... pero buen a mejorar eso.. muy bueno el codigo.. para mi...muy complejo
(dsandoval 2007-08-02 12:21:22)
Ante todo quiero dar las gracias a Kropzter por sus aportaciones. Quería comentar que hay varias funciones comentadas como iterativas cuando son recursivas.
(acamba 2008-01-02 02:18:44)
El codigo no soporta elementos repetidos, ya que ni si quiera los trata los omite directamente.
(riocuartopc 2008-10-01 09:47:17)
no entendi ni de que sirve XD
(chwc 2008-10-04 19:45:41)
xvre man el codigo lo voy a mejorar
(hcc_107 2008-11-05 14:24:42)
buenas tardes, solamente felicitarte por tu programa lo cale en borlandc y si funciona bien pero lo que no entendi es el funcionamiento de los ordenes sobre el arbol. como es esto posible de que forma lo ordena? saludos
(pepon7112 2009-02-13 08:55:50)
GRASIAS
(JULIO_LONIS 2009-03-08 15:41:10)
de verdad eres u monstro pero deviste hacer algunos arreglos
(arismendysoft 2009-11-26 15:06:42)
buena charada rey me funciona en borlan c++
(ademay 2010-05-25 14:24:48)
gracias por subir programas como ese son de gran ayuda
(mami 2010-06-01 04:11:47)
Muy bueno, gracias compañero
(fanukizz 2011-05-30 17:58:55)
cual seria el codigo para un arbol B+ en lenguaje c gracias
(davmarcha 2011-10-10 21:35:33)
Con este codigo me pude basar para entender todo lo que no pude en varios dias buscando videos, en verdad muchas gracias!
(shaciel 2012-04-10 01:58:00)
como se podrian comparar 2 arboles binarios de busqueda en "c" y me entregue un arbol comun que seria el resultante entre los 2 que contengan los mismos numeros en las mismas posiciones en los arboles se los agradeceria si me pudieran ayudar con el codigo en c gracias
(evidal 2012-05-08 16:14:37)
http://www.facebook.com/Desarrollo.Facil?ref=hl#!/Desarrollo.Facil
(gaona 2012-07-26 19:40:28)
Pagina relacionada con las dudas que surgen al momento de comenzar a desarrollar. Esta pagina maneja temas de nivel basico, Medio y avanzado con la bondad que se puede relacionar con cualquier lenguage de programacion. http://www.facebook.com/Desarrollo.Facil?ref=hl#!/Desarrollo.Facil Entren esta bastante buena y ahy aportes de muy buenos y que si ayudan
(gaona 2012-07-26 19:42:53)

Para enviar comentarios debes estar registrado.

(c) ElRincondelC.com, 1999-2007

Un proyecto de Urlan Heat : proyectos de Internet y soporte para el comercio electrónico.