Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ayuda arboles binarios

Estas en el tema de ayuda arboles binarios en el foro de C/C++ en Foros del Web. A ver si me pueden ayudar con los siguientes funciones en c de un arbol binario. Necesito una funcion recursiva que cuente las hojas, Y ...
  #1 (permalink)  
Antiguo 24/10/2010, 12:04
 
Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 13 años, 6 meses
Puntos: 0
ayuda arboles binarios

A ver si me pueden ayudar con los siguientes funciones en c de un arbol binario.

Necesito una funcion recursiva que cuente las hojas,

Y otra funcion que sume los valores enteros del arbol.

saludos y gracias
  #2 (permalink)  
Antiguo 24/10/2010, 12:37
 
Fecha de Ingreso: junio-2010
Mensajes: 132
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: ayuda arboles binarios

Seria bueno q pusieras el codigo, porke las implementaciones pueden llegar a diferir con tu clase arbol, pero francamente son un por de funciones muy faciles, si no tienes nada, dime para pasarte todos los programas de arboles q tengo, Saludos
  #3 (permalink)  
Antiguo 24/10/2010, 13:00
 
Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: ayuda arboles binarios

Bueno esto es lo que tengo, solo tengo declarada la funcion de contar hojas pero esta vacia, y falta la funcion de contar la suma de todos los elemntos del arbol
Código:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct Nodo
{
    int dato;
    struct Nodo *HijoIzquierdo, *HijoDerecho;
} NodoArbol;

NodoArbol *Raiz;

//Declaro las funciones que tiene el programa
NodoArbol* InsertaNodo(int, NodoArbol*);
void EnOrden(NodoArbol*);
void PreOrden(NodoArbol*);
void PostOrden(NodoArbol*);
int Nivel_arbol(NodoArbol*);
int NumeroNodo(NodoArbol*);
int FE(NodoArbol*);
int Total_hojas(NodoArbol*);


int main()
{
	int k,num,opc=1,valor,nivel=0,nodos=0,nivel_esperado,frecu=0,hojas=0;
	
	Raiz=NULL;
		
	while(opc!=10)
	{
		printf("1.- Insertar Arbol\n");
		printf("2.- Recorrido en preorden\n");
		printf("3.- Recorrido  en orden\n");
		printf("4.- Recorrido en postorden\n");
		printf("5.- Nivel del arbol\n");
		printf("6.- Numero de Nodos\n");
		printf("7.- Nivel Perfecto de Nodos\n");
		printf("8.- Factor de Equilibrio\n");
		printf("9.- Numero de Hojas\n");
		printf("10.- Salir\n");
		scanf("%d",&opc);
		
		switch(opc)
		{
			case 1:
				printf("Inserta Numero para el Arbol\n");
				scanf("%d",&num);
				Raiz=InsertaNodo(num, Raiz);
				//printf("Quieres seguir...");
				break;
			
			case 2:  PreOrden(Raiz);
				printf("\n");
				break;
				
			case 3:  EnOrden(Raiz);
				printf("\n");
				break;
				
			case 4:  PostOrden(Raiz);
				printf("\n");
				break;
				
			case 5: 
				nivel=Nivel_arbol(Raiz);
				printf("Nivel del Arbol %d\n", nivel-1);
				break;
				
			case 6:
				nodos=NumeroNodo(Raiz);
				printf("Numero de Nodos %d\n", nodos);
				break;
				
			case 7:
				nivel_esperado=log(NumeroNodo(Raiz))/log(2);
				printf("El Nivel Perfecto %d\n", nivel_esperado);
				break;
				
			case 8:
				frecu=FE(Raiz);
				printf("Factor de Equilibrio es %d \n", frecu);
				break;
			
			case 9:
				hojas=Total_hojas(Raiz);
				break;
				
		}
		
	}
	system("PAUSE");
	return 0;    
	
}

NodoArbol* InsertaNodo(int valor, NodoArbol *subArbol)
{
	if(subArbol==NULL)
	{
		subArbol=new NodoArbol;
		subArbol->HijoIzquierdo=subArbol->HijoDerecho=NULL;
		subArbol->dato=valor;
	}
	else
		
		if(valor<subArbol->dato)
			subArbol->HijoIzquierdo=InsertaNodo(valor, subArbol->HijoIzquierdo);
	
		else
			subArbol->HijoDerecho=InsertaNodo(valor, subArbol->HijoDerecho);
	return(subArbol);
}


void EnOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		EnOrden(subArbol->HijoIzquierdo);
		printf("%d ", subArbol->dato);
		EnOrden(subArbol->HijoDerecho);
	}  
}

void PreOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		printf("%d ", subArbol->dato);
		PreOrden(subArbol->HijoIzquierdo);      
		PreOrden(subArbol->HijoDerecho);
	}  
}

void PostOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		
		PostOrden(subArbol->HijoIzquierdo);      
		PostOrden(subArbol->HijoDerecho);
		printf("%d ", subArbol->dato);
	}  
}

int Nivel_arbol(NodoArbol *subArbol)
{
    int a=0,b=0;
	if(subArbol==NULL)
	{
		return 1;
	}
	
	else 
	{
		a=Nivel_arbol(subArbol->HijoIzquierdo)+1;
		b=Nivel_arbol(subArbol->HijoDerecho)+1;
	}
	if(a>=b)
		return a++; //Le sumo la raiz
	else
		return b++; //Le sumo la raiz
	
}

int NumeroNodo (NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;
	
	else
		return 1+NumeroNodo(subArbol->HijoIzquierdo)+NumeroNodo(subArbol->HijoDerecho);
}

int FE(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;
	
	else 
		return Nivel_arbol(subArbol->HijoDerecho)-Nivel_arbol(subArbol->HijoIzquierdo);
}

int Total_hojas(NodoArbol *subArbol)
{
	
}
  #4 (permalink)  
Antiguo 24/10/2010, 13:06
 
Fecha de Ingreso: junio-2010
Mensajes: 132
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: ayuda arboles binarios

Ok dame unos minutos q estoy ocupado en casa, y al terminar te hago las 2 funciones...esperame
  #5 (permalink)  
Antiguo 24/10/2010, 13:09
 
Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: ayuda arboles binarios

Cita:
Iniciado por deitynitros98 Ver Mensaje
Ok dame unos minutos q estoy ocupado en casa, y al terminar te hago las 2 funciones...esperame
No hay ningun problema amigo, y si pudes pasar los otros que mencionas pues que mejor
  #6 (permalink)  
Antiguo 24/10/2010, 13:15
 
Fecha de Ingreso: junio-2010
Mensajes: 132
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: ayuda arboles binarios

ok pero debo advertirte q los mios son un poco mas profundos, porke son hechos con clases y no con struct, Saludos ya falta poco
  #7 (permalink)  
Antiguo 24/10/2010, 16:12
 
Fecha de Ingreso: junio-2010
Mensajes: 132
Antigüedad: 13 años, 11 meses
Puntos: 3
Respuesta: ayuda arboles binarios

Aki tienes todo el codigo, las dos funciones (ambas hay q usar) que dan la cantidad de hojas, la funcion que suma y la funcion nivel modificada, ya que, la raiz no se suma, la raiz se encuentra en un nivel 0, es decir, q si en tu arbol se encuentra unicamente la raiz, entonces tu arbol tendra un nivel 0, la raiz no cuenta como nivel y tampoco cuenta como hoja, como su nombre lo indica, es una raiz, osea esta en el suelo....xD.Saludos,

PD: Luego posteo los demas programas (hechos con clases), para que te ayuden. PD2: jamas he trabajado con C, siempre he usado C++.

Código:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <iostream>

using namespace std;

typedef struct Nodo
{
    int dato;
    struct Nodo *HijoIzquierdo, *HijoDerecho;
} NodoArbol;

NodoArbol *Raiz;

//Declaro las funciones que tiene el programa
NodoArbol* InsertaNodo(int, NodoArbol*);
void EnOrden(NodoArbol*);
void PreOrden(NodoArbol*);
void PostOrden(NodoArbol*);
int Nivel_arbol(NodoArbol*);
int NumeroNodo(NodoArbol*);
int FE(NodoArbol*);
int Total_hojas2(NodoArbol*);
int Total_hojas(NodoArbol*);
int Suma_nodos(NodoArbol*);


int main()
{
	int k,num,opc=1,valor,nivel=0,nodos=0,nivel_esperado,frecu=0,hojas=0;
	
	Raiz=NULL;
		
	while(opc!=11)
	{
		printf("1.- Insertar Arbol\n");
		printf("2.- Recorrido en preorden\n");
		printf("3.- Recorrido  en orden\n");
		printf("4.- Recorrido en postorden\n");
		printf("5.- Nivel del arbol\n");
		printf("6.- Numero de Nodos\n");
		printf("7.- Nivel Perfecto de Nodos\n");
		printf("8.- Factor de Equilibrio\n");
		printf("9.- Numero de Hojas\n");
		printf("10.- Suma de Nodos\n");
		printf("11.- Salir\n");
		scanf_s("%d",&opc);
		
		switch(opc)
		{
			case 1:
				printf("Inserta Numero para el Arbol\n");
				scanf_s("%d",&num);
				Raiz=InsertaNodo(num, Raiz);
				//printf("Quieres seguir...");
				break;
			
			case 2:  PreOrden(Raiz);
				printf("\n");
				break;
				
			case 3:  EnOrden(Raiz);
				printf("\n");
				break;
				
			case 4:  PostOrden(Raiz);
				printf("\n");
				break;
				
			case 5: 
				nivel=Nivel_arbol(Raiz);
				printf("Nivel del Arbol %d\n", nivel-1);
				break;
				
			case 6:
				nodos=NumeroNodo(Raiz);
				printf("Numero de Nodos %d\n", nodos);
				break;
				
			case 7:
				nivel_esperado = log(float(NumeroNodo(Raiz)))/log(2.0);
				printf("El Nivel Perfecto %d\n", nivel_esperado);
				break;
				
			case 8:
				frecu=FE(Raiz);
				printf("Factor de Equilibrio es %d \n", frecu);
				break;
			
			case 9:
				hojas=Total_hojas(Raiz);
				printf("La cantidad de Hojas es %d\n",hojas);
				//cout<<hojas<<endl;
				break;

			case 10:
				printf("La suma es %d\n", Suma_nodos(Raiz));
				break;


				
		}
		
	}
	system("PAUSE");
	return 0;    
	
}

NodoArbol* InsertaNodo(int valor, NodoArbol *subArbol)
{
	if(subArbol==NULL)
	{
		subArbol=new NodoArbol;
		subArbol->HijoIzquierdo=subArbol->HijoDerecho=NULL;
		subArbol->dato=valor;
	}
	else
		
		if(valor<subArbol->dato)
			subArbol->HijoIzquierdo=InsertaNodo(valor, subArbol->HijoIzquierdo);
	
		else
			subArbol->HijoDerecho=InsertaNodo(valor, subArbol->HijoDerecho);
	return(subArbol);
}


void EnOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		EnOrden(subArbol->HijoIzquierdo);
		printf("%d ", subArbol->dato);
		EnOrden(subArbol->HijoDerecho);
	}  
}

void PreOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		printf("%d ", subArbol->dato);
		PreOrden(subArbol->HijoIzquierdo);      
		PreOrden(subArbol->HijoDerecho);
	}  
}

void PostOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		
		PostOrden(subArbol->HijoIzquierdo);      
		PostOrden(subArbol->HijoDerecho);
		printf("%d ", subArbol->dato);
	}  
}

int Nivel_arbol(NodoArbol *subArbol)
{
    int a=0,b=0;
	if(subArbol==NULL)
	{
		return 0;
	}
	
	else 
	{
		a=Nivel_arbol(subArbol->HijoIzquierdo)+1;
		b=Nivel_arbol(subArbol->HijoDerecho)+1;
	}
	if(a>=b)
		return a; //La raiz no se suma
	else
		return b; //La raiz no se suma
	
}

int NumeroNodo (NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;
	
	else
		return 1+NumeroNodo(subArbol->HijoIzquierdo)+NumeroNodo(subArbol->HijoDerecho);
}

int FE(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;
	
	else 
		return Nivel_arbol(subArbol->HijoDerecho)-Nivel_arbol(subArbol->HijoIzquierdo);
}

int Total_hojas(NodoArbol *subArbol)
{
	if(Raiz==NULL)
		return 0;
	if(Raiz->HijoDerecho==NULL && Raiz->HijoIzquierdo==NULL)
		return 0;

	return Total_hojas2(subArbol);
}

int Total_hojas2(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;

	if(subArbol->HijoDerecho==NULL&&subArbol->HijoIzquierdo==NULL)
		return 1;

	return Total_hojas(subArbol->HijoDerecho) + Total_hojas(subArbol->HijoIzquierdo);


	//return 0;
}

int Suma_nodos(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;

	return subArbol->dato + Suma_nodos(subArbol->HijoDerecho) + Suma_nodos(subArbol->HijoIzquierdo);

}
  #8 (permalink)  
Antiguo 24/10/2010, 18:03
 
Fecha de Ingreso: octubre-2010
Mensajes: 13
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: ayuda arboles binarios

Cita:
Iniciado por deitynitros98 Ver Mensaje
Aki tienes todo el codigo, las dos funciones (ambas hay q usar) que dan la cantidad de hojas, la funcion que suma y la funcion nivel modificada, ya que, la raiz no se suma, la raiz se encuentra en un nivel 0, es decir, q si en tu arbol se encuentra unicamente la raiz, entonces tu arbol tendra un nivel 0, la raiz no cuenta como nivel y tampoco cuenta como hoja, como su nombre lo indica, es una raiz, osea esta en el suelo....xD.Saludos,

PD: Luego posteo los demas programas (hechos con clases), para que te ayuden. PD2: jamas he trabajado con C, siempre he usado C++.

Código:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <iostream>

using namespace std;

typedef struct Nodo
{
    int dato;
    struct Nodo *HijoIzquierdo, *HijoDerecho;
} NodoArbol;

NodoArbol *Raiz;

//Declaro las funciones que tiene el programa
NodoArbol* InsertaNodo(int, NodoArbol*);
void EnOrden(NodoArbol*);
void PreOrden(NodoArbol*);
void PostOrden(NodoArbol*);
int Nivel_arbol(NodoArbol*);
int NumeroNodo(NodoArbol*);
int FE(NodoArbol*);
int Total_hojas2(NodoArbol*);
int Total_hojas(NodoArbol*);
int Suma_nodos(NodoArbol*);


int main()
{
	int k,num,opc=1,valor,nivel=0,nodos=0,nivel_esperado,frecu=0,hojas=0;
	
	Raiz=NULL;
		
	while(opc!=11)
	{
		printf("1.- Insertar Arbol\n");
		printf("2.- Recorrido en preorden\n");
		printf("3.- Recorrido  en orden\n");
		printf("4.- Recorrido en postorden\n");
		printf("5.- Nivel del arbol\n");
		printf("6.- Numero de Nodos\n");
		printf("7.- Nivel Perfecto de Nodos\n");
		printf("8.- Factor de Equilibrio\n");
		printf("9.- Numero de Hojas\n");
		printf("10.- Suma de Nodos\n");
		printf("11.- Salir\n");
		scanf_s("%d",&opc);
		
		switch(opc)
		{
			case 1:
				printf("Inserta Numero para el Arbol\n");
				scanf_s("%d",&num);
				Raiz=InsertaNodo(num, Raiz);
				//printf("Quieres seguir...");
				break;
			
			case 2:  PreOrden(Raiz);
				printf("\n");
				break;
				
			case 3:  EnOrden(Raiz);
				printf("\n");
				break;
				
			case 4:  PostOrden(Raiz);
				printf("\n");
				break;
				
			case 5: 
				nivel=Nivel_arbol(Raiz);
				printf("Nivel del Arbol %d\n", nivel-1);
				break;
				
			case 6:
				nodos=NumeroNodo(Raiz);
				printf("Numero de Nodos %d\n", nodos);
				break;
				
			case 7:
				nivel_esperado = log(float(NumeroNodo(Raiz)))/log(2.0);
				printf("El Nivel Perfecto %d\n", nivel_esperado);
				break;
				
			case 8:
				frecu=FE(Raiz);
				printf("Factor de Equilibrio es %d \n", frecu);
				break;
			
			case 9:
				hojas=Total_hojas(Raiz);
				printf("La cantidad de Hojas es %d\n",hojas);
				//cout<<hojas<<endl;
				break;

			case 10:
				printf("La suma es %d\n", Suma_nodos(Raiz));
				break;


				
		}
		
	}
	system("PAUSE");
	return 0;    
	
}

NodoArbol* InsertaNodo(int valor, NodoArbol *subArbol)
{
	if(subArbol==NULL)
	{
		subArbol=new NodoArbol;
		subArbol->HijoIzquierdo=subArbol->HijoDerecho=NULL;
		subArbol->dato=valor;
	}
	else
		
		if(valor<subArbol->dato)
			subArbol->HijoIzquierdo=InsertaNodo(valor, subArbol->HijoIzquierdo);
	
		else
			subArbol->HijoDerecho=InsertaNodo(valor, subArbol->HijoDerecho);
	return(subArbol);
}


void EnOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		EnOrden(subArbol->HijoIzquierdo);
		printf("%d ", subArbol->dato);
		EnOrden(subArbol->HijoDerecho);
	}  
}

void PreOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		printf("%d ", subArbol->dato);
		PreOrden(subArbol->HijoIzquierdo);      
		PreOrden(subArbol->HijoDerecho);
	}  
}

void PostOrden(NodoArbol *subArbol)
{
	if (subArbol!=NULL)
	{
		
		PostOrden(subArbol->HijoIzquierdo);      
		PostOrden(subArbol->HijoDerecho);
		printf("%d ", subArbol->dato);
	}  
}

int Nivel_arbol(NodoArbol *subArbol)
{
    int a=0,b=0;
	if(subArbol==NULL)
	{
		return 0;
	}
	
	else 
	{
		a=Nivel_arbol(subArbol->HijoIzquierdo)+1;
		b=Nivel_arbol(subArbol->HijoDerecho)+1;
	}
	if(a>=b)
		return a; //La raiz no se suma
	else
		return b; //La raiz no se suma
	
}

int NumeroNodo (NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;
	
	else
		return 1+NumeroNodo(subArbol->HijoIzquierdo)+NumeroNodo(subArbol->HijoDerecho);
}

int FE(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;
	
	else 
		return Nivel_arbol(subArbol->HijoDerecho)-Nivel_arbol(subArbol->HijoIzquierdo);
}

int Total_hojas(NodoArbol *subArbol)
{
	if(Raiz==NULL)
		return 0;
	if(Raiz->HijoDerecho==NULL && Raiz->HijoIzquierdo==NULL)
		return 0;

	return Total_hojas2(subArbol);
}

int Total_hojas2(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;

	if(subArbol->HijoDerecho==NULL&&subArbol->HijoIzquierdo==NULL)
		return 1;

	return Total_hojas(subArbol->HijoDerecho) + Total_hojas(subArbol->HijoIzquierdo);


	//return 0;
}

int Suma_nodos(NodoArbol *subArbol)
{
	if(subArbol==NULL)
		return 0;

	return subArbol->dato + Suma_nodos(subArbol->HijoDerecho) + Suma_nodos(subArbol->HijoIzquierdo);

}
Muchas gracias amigo, te lo agradezco mucho

saludos

Etiquetas: arboles, binario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:26.