Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Jupiter34 en 9 Noviembre 2012, 22:42 PM

Título: Duda Arboles - C
Publicado por: Jupiter34 en 9 Noviembre 2012, 22:42 PM
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!
Título: Re: Duda Arboles - C
Publicado por: Oblivi0n en 9 Noviembre 2012, 22:46 PM
Haz una modificacion a cualquiera de los caminos para recorrer un arbol ( postorden, inorden, preorden), cogiendo el dato de cada nodo y sumandolo.
Título: Re: Duda Arboles - C
Publicado por: Jupiter34 en 9 Noviembre 2012, 22:49 PM
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!
Título: Re: Duda Arboles - C
Publicado por: Oblivi0n en 9 Noviembre 2012, 22:55 PM
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 )
Título: Re: Duda Arboles - C
Publicado por: Ferno en 9 Noviembre 2012, 23:06 PM
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
Título: Re: Duda Arboles - C
Publicado por: Jupiter34 en 9 Noviembre 2012, 23:20 PM
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
Título: Re: Duda Arboles - C
Publicado por: Jupiter34 en 22 Noviembre 2012, 21:55 PM
Estoy peleando..Se como sacar el Maximo, peroquiero discriminar entre par o impar...

Como debería hacerlo? No se para donde ir!
Título: Re: Duda Arboles - C
Publicado por: rir3760 en 23 Noviembre 2012, 02:05 AM
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