Estimados,
Estoy practicando, pero no logro dar con la tecla...
El tema es ARBOLES.
He logrado recorrer el arbol, mostrandolo Izq Raiz Der, Raiz Izq Der y Izq Der Raiz, tambien la profundidad y buscar un Nodo en Particular...
No logro sumar los valores (hoja->dato) de los nodos! De manera recursiva!
//Mostrar en orden (IRD)
void mostrarOrden (treenode *hoja)
{
if (hoja!=NULL)
{
mostrarOrden(hoja->izq);
printf("%d ",hoja->dato);
mostrarOrden(hoja->der);
}
return;
}
//Mostrar en preOrden (RID)
void mostrarPreorden(treenode *hoja)
{
if (hoja!=NULL)
{
printf("%d ",hoja->dato);
mostrarPreorden(hoja->izq);
mostrarPreorden(hoja->der);
}
return;
}
//mostrar en posOrden (IDR)
void mostrarPosorden(treenode *hoja)
{
if (hoja!=NULL)
{
mostrarPosorden(hoja->izq);
mostrarPosorden(hoja->der);
printf("%d ",hoja->dato);
}
return;
}
//Calcula profundidad del arbol
int profundidad(treenode *hoja)
{
if(hoja==NULL)
return 0;
else{
int profI=profundidad(hoja->izq);
int profD=profundidad(hoja->der);
if(profI>profD)
return profI+1;
else
return profD+1;
}
return;
}
/*
//Buscar nodo
treenode *busqueda(treenode *hoja, int busq)
{
if(hoja==NULL)
return 0;
else
if(busq==hoja->dato)
return hoja;
if(busq<hoja->dato)
{
return busqueda(hoja->izq,busq);
}else{
return busqueda(hoja->der,busq);
}
return;
}
*/
//Cuenta nodos impares
int contarImp(treenode *hoja){
if (hoja!=NULL)
{
contarImp(hoja->izq);
int cuenta=cuenta+(hoja->dato%2==0);
contarImp(hoja->der);
return cuenta;
}
}
Me podrian dar una mano?
Como siempre, mil gracias!!
Saludos para todos!
Haz una modificacion a cualquiera de los caminos para recorrer un arbol ( postorden, inorden, preorden), cogiendo el dato de cada nodo y sumandolo.
Oblivi0n muchas gracias por la pronta respuesta...El tema es que tengo que contar, los impares...realize mal la consulta...
No se donde o que recibiria el (hoja->dato%2==0)
Me logro explicar? Tengo que ver los nodos y contar los impares!
es simple, puedes meter una sentencia tal que if(nodo->dato %2 == 0) { seguir con el siguiente nodo } else { sumar el dato y seguir con el camino }
( ahora mismo no te puedo poner código )
Puedes sumarle un parámetro a cada una de las funciones que recorren el árbol que sea un puntero a int (o a float o double, dependiendo del tipo de dato).
Dentro de la función le sumas el dato correspondiente a esa variable, y cuando retorne de la función recursiva, imprimes el dato en el programa principal
Listo chicos! Muchas gracias!!
Asi quedo!
//Cuenta nodos impares
int contarImp(treenode *hoja,int imp){
if (hoja!=NULL)
{
if(hoja->dato%2!=0)
{
imp++;
}
return contarImp(hoja->izq,imp);
return contarImp(hoja->der,imp);
}
return imp;
}
Y el dato importante..en la llamada...
impar=contarImp(arb,imp+1);
El +1
Estoy peleando..Se como sacar el Maximo, peroquiero discriminar entre par o impar...
Como debería hacerlo? No se para donde ir!
Cita de: Jupiter34 en 9 Noviembre 2012, 23:20 PM
//Cuenta nodos impares
int contarImp(treenode *hoja,int imp){
if (hoja!=NULL)
{
if(hoja->dato%2!=0)
{
imp++;
}
return contarImp(hoja->izq,imp);
return contarImp(hoja->der,imp);
}
return imp;
}
Y el dato importante..en la llamada...
impar=contarImp(arb,imp+1);
No, no funciona. Imagina por un momento que se pasa un árbol vació, en ese caso la función termina de inmediato y debe reportar cero números impares.
Otro error en la función es tener dos sentencias de retorno dentro del condicional "if", una a continuación de la otra:
return contarImp(hoja->izq,imp);
return contarImp(hoja->der,imp); /* <== Nunca se ejecuta */
Para contar el numero de valores impares puedes utilizar, por ejemplo:
int contarImp(treenode *p)
{
return p == NULL ? 0 : p->dato % 2 + contarImp(p->izq) + contarImp(p->der);
}
Un saludo