Ir al contenido principal

ARBOLES BINARIOS EN C++

hoy tenemos un codigo que maneja arboles binarios en c++
este codigo esta con sus respectivos comentarios para tener un mejor entendimiento del mismo igual podemos descargar el codigo


// Arboles.cpp: archivo de proyecto principal.
//librerias utilizadas
#include "stdafx.h"
#include
#include
using namespace std;
#define IZQ 1
#define DER 2
/*Estructura Utilizada para representar los nodos del arbol*/
struct NODO
{
int dato;
NODO * hijoIzq;
NODO * hijoDer;
};
/*VARIABLES GLOBALES*/
NODO * CAB_Arbol_1 = NULL; //cabecera del arbol 1
NODO * CAB_Arbol_2 = NULL; //cabecera del arbol 2
/*Prototipos de los procedimientos y funciones utilizados*/
void Generar_Arboles();
void Comparar_Arboles();
NODO* Generar_Nodo_Binario(int) ;
void Mostrar_Arbol(NODO *, int, int);
int Comparar_Igualdad(NODO *, NODO *);
/*Procedimiento que es el punto de partida del programa*/
int main()
{
//generamos los Arboles
Generar_Arboles();
printf("\n\n");
//comparamos los arboles
Comparar_Arboles();
printf("\n\n");
system("PAUSE");
return 0;
}
/*
* Metodo de Generacion de los arboles necesarios
*/
void Generar_Arboles()
{
//Generamos el primer arbol
printf("-----------------------------------------------------------------------------------\n");
printf(" GENERACION DEL PRIMER ARBOL BINARIO \n");
printf("-----------------------------------------------------------------------------------\n");
printf("\n");
//llamamos al metodo que genera los nodos
CAB_Arbol_1 = Generar_Nodo_Binario(0);
printf("\n");
printf("El arbol construido es: \n\n");
Mostrar_Arbol(CAB_Arbol_1, 0, 0);
printf("\n\n");
//Generamos el segundo arbol
printf("-----------------------------------------------------------------------------------\n");
printf(" GENERACION DEL SEGUNDO ARBOL BINARIO \n");
printf("-----------------------------------------------------------------------------------\n");
printf("\n");
//llamamos al metodo que genera los nodos
CAB_Arbol_2 = Generar_Nodo_Binario(0);
printf("\n");
printf("El arbol construido es: \n\n");
Mostrar_Arbol(CAB_Arbol_2, 0, 0);
}
/*
Procedimiento que utiliza la comparacion de igualdad de arboles y muestra el resultado
*/
void Comparar_Arboles()
{
printf("-----------------------------------------------------------------------------------\n");
printf(" COMPARACION DE IGUALDAD DE LOS ARBOLES \n");
printf("-----------------------------------------------------------------------------------\n");
printf("\n");
int resultado = Comparar_Igualdad(CAB_Arbol_1, CAB_Arbol_2);
if(resultado == 1)
{
printf(" Los Arboles SON Iguales \n");
}
else
{
printf(" Los Arboles NO SON Iguales \n");
}
}
/*
Definicion del procedimiento Generar Nodo Binario
Se genera un nodo, almacenando el dato corespondiente
Si se desea generar un hijo izq o derecho se llama
al mismo metodo y el nodo retonado es asignado al
respectivo enlace
*/
NODO* Generar_Nodo_Binario(int nivel)
{
char opcion;
NODO * nodo = new(NODO);
//imprimimos los espacios que representan el nivel
for(int i=1; i<=nivel*3; i++)
{
printf("-");
}
//pedimos al usuario que ingrese el valor
printf("Ingrese el valor del nodo: ");
cin >> nodo->dato;
//imprimimos los espacios que representan el nivel
for(int i=1; i<=nivel*3; i++)
{
printf(" ");
}
//preguntamos si se generara el hijo izquierdo
printf("Agregar el Hijo izquierdo del Nodo %d ? (S=Si; N=no) : ", nodo->dato);
cin >> opcion;
//validamos que ingrese un dato correcto
while (opcion != 'S' && opcion != 's' && opcion != 'N' && opcion != 'n')
{
printf(" *** Opcion no valida ***\n");
//imprimimos los espacios que representan el nivel
for(int i=1; i<=nivel*3; i++)
{
printf(" ");
}
printf("Agregar el Hijo izquierdo del Nodo %d ? (S=Si; N=no) : ", nodo->dato);
cin >> opcion;
}
//en caso que desee generar el hijo izquierdo....
if(opcion == 'S' || opcion == 's')
{
//se realiza un llamado recursivo de este mismo procedimiento para generar el nuevo nodo
nodo->hijoIzq = Generar_Nodo_Binario(nivel+1);
}
else
{
nodo->hijoIzq = NULL;
}
//imprimimos los espacios que representan el nivel
for(int i=1; i<=nivel*3; i++)
{
printf(" ");
}
//preguntamos si se generara el hijo derecho
printf("Agregar el Hijo Derecho del Nodo %d ? (S=Si; N=no) : ", nodo->dato);
cin >> opcion;
//validamos que ingrese un dato correcto
while (opcion != 'S' && opcion != 's' && opcion != 'N' && opcion != 'n')
{
printf(" *** Opcion no valida ***\n");
//imprimimos los espacios que representan el nivel
for(int i=1; i<=nivel*3; i++)
{
printf(" ");
}
printf("Agregar el Hijo Derecho del Nodo %d ? (S=Si; N=no) : ", nodo->dato);
cin >> opcion;
}
//en caso que desee generar el hijo derecho....
if(opcion == 'S' || opcion == 's')
{
//se realiza un llamado recursivo de este mismo procedimiento para generar el nuevo nodo
nodo->hijoDer = Generar_Nodo_Binario(nivel+1);
}
else
{
nodo->hijoDer = NULL;
}
//devolvemos el nodo creado
return nodo;
}
/*
Procedimiento para mostrar un arbol
*/
void Mostrar_Arbol(NODO * nodo, int nivel, int tipo)
{
//imprimimos los espacios que representan el nivel
for(int i=1; i<=nivel*5; i++)
{
printf("-");
}
//imprimimos el tipo del nodo
if(tipo == IZQ)
{
printf("IZQ: ");
}
else if (tipo == DER)
{
printf("DER: ");
}
//imprimimos el valor del nodo
printf("%d \n", nodo->dato);
//si el nodo tiene hijo izquierdo...
if(nodo->hijoIzq != NULL)
{
Mostrar_Arbol(nodo->hijoIzq, nivel+1, IZQ);
}
//si el nodo tiene hijo derecho...
if(nodo->hijoDer != NULL)
{
Mostrar_Arbol(nodo->hijoDer, nivel+1, DER);
}
}
/*
funcion que comprar si dos arboles binarios son iguales,
Esta funcion se ejecuta de forma recursiva asi:
primero se comparan los valores (datos) de los nodos datos
si son iguales se compara la existencia de los nodos izquiero y derechos
si ambos tiene hijos izquierdo o derecho se llama la funcion de comparacion para evaluar estos nodoso y sus hijos
retorna 1 si no iguales
retorna 0 si no son iguales
*/
int Comparar_Igualdad(NODO * nodo1, NODO * nodo2)
{
//si el valor de los nodos son diferentes
if(nodo1->dato != nodo2->dato)
{
return 0;
}
//si el nodo 1 tiene hijo izquierdo..
if(nodo1->hijoIzq != NULL)
{
//el nodo 2 no tiene hijo izquierdo...
if(nodo2->hijoIzq == NULL)
{
//los nodos no son iguales
return 0;
}
//realizamos una comparacion de igualdad de los nodos izquierdos
//y si este da como resultado que no son iguales...
if( Comparar_Igualdad( nodo1->hijoIzq, nodo2->hijoIzq) == 0)
{
//entonces tampoco son iguales los nodos padres
return 0;
}
}
//en caso que el nodo 1 no tenga hijo izquierdo...
else
{
//si el nodo 2 si tiene hijo izquierdo
if(nodo2->hijoIzq != NULL)
{
//los nodos no son semejantes
return 0;
}
}
//Si el nodo 1 tiene Hijo Derecho..
if(nodo1->hijoDer != NULL)
{
//si el nodo 2 no tiene hijo derecho...
if(nodo2->hijoDer == NULL)
{
//los nodos no son iguales
return 0;
}
//realizamos una comparacion de igualdad de los nodos derechos
//y si este da como resultado que no son iguales...
if( Comparar_Igualdad( nodo1->hijoDer, nodo2->hijoDer) == 0)
{
//entonces tampoco son iguales los nodos padres
return 0;
}
}
//en caso que el nodo 1 no tenga hijo izquierdo...
else
{
//si el nodo 2 si tiene hijo izquierdo
if(nodo2->hijoDer != NULL)
{
//los nodos no son semejantes
return 0;
}
}
return 1;
}

Comentarios

Entradas populares de este blog

Tablas y gráficas estadísticas dinámicas con JavaScript, highcharts, HTML y JSON

Después de tener mucho tiempo sin entradas, quiero retomar  el blog  con un poco más de desarrollo códigos ejemplos y más cosas interesantes que he podido realizar en mi día a día. En esta ocasión quiero realizar un ejemplo para el cual pueda  graficar tablas, gráficas estadísticas  utilizando la librería de highcharts ( https://www.highcharts.com/ ), esta librería tiene muchas aplicaciones se puede  usar en diferentes campos y es realmente interesante para realizar todo tipo de tratamiento de data. Este ejemplo se va a trabajar sobre un proyecto realizado en visual studio 2015, pero se debe tener en cuenta que se puede aplicar a cualquier tipo de proyecto en el cual se use javascript y objetos JSON. La idea con este código es poder generar la cantidad de objetos JSON que sean necesarios desde  el code behind usado y este sea procesado para que se genere a nivel del cliente todas las gráficas requeridas. Ejemplo: 1- Se debe crear e...

Exportar Archivos en C# con NPOI

Siempre que se tiene que exportar un archivo, se tienen varias opciones; se puede pensar en usar reporting services, se puede usar librerías que se encuentran en la red, se pueden usar librerías especificas de .NET, pero hoy vamos a ver como usar la librería NPOI. La librería NPOI es una librería de código abierto que se usa para parsear data en archivos de excel, en este caso vamos a usar  un data set  para realizar toda la operación. Se va a crear un libro de excel con extensión xlsx, en el cual se va a crear la plantilla que se requiere para poder visualizar la data y la gráfica correspondiente. se crea el método dentro del cual se tendrá la lógica         public void ejemplonpoi()           { } Se crean la variables necesarias para realizar la conversión del archivo             var extension = "xlsx";             string result = Path.Get...

CREAR ARCHIVOS TXT EN VISUAL BASIC 2010

Buenas hoy veremos un ejemplo para crear un archivo .txt en visual basic .NET  utilizando la herramienta visual studio 2010. el manual de referencia lo podemos encontrar en el libro  VISUAL BASIC .NET lenguaje y aplicaciones 3ra edicion  Fco. Javier Ceballos el tipo de acceso mas simple a un fichero de datos es el secuencial, un fichero abierto  para acceso secuencial es un fichero que puede almacenar registros de cualquier longitud. Este tipo de acceso generalmente se utiliza con ficheros de texto en los que se escribe toda la información desde el principio hasta el final y se lee de la misma forma. las acciones mas comunes que se manejan a la hora de trabajar con archivos son: CreateNew: crea un nuevo fichero. Si el fichero existe se lanzara una excepción del tipo IOException Create: Crear un nuevo fichero. Si el fichero existe sera sobrescrito  Open: abrir el fichero existente OpenOrCreate: abrir un fichero si e...