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
| |||
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 |
| |||
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 |
| |||
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) { } |
| |||
Respuesta: ayuda arboles binarios No hay ningun problema amigo, y si pudes pasar los otros que mencionas pues que mejor |
| |||
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); } |
Etiquetas: |