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);
}