Duda Arboles - C

Iniciado por Jupiter34, 9 Noviembre 2012, 22:42 PM

0 Miembros y 1 Visitante están viendo este tema.

Jupiter34

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!

Oblivi0n

#1
Haz una modificacion a cualquiera de los caminos para recorrer un arbol ( postorden, inorden, preorden), cogiendo el dato de cada nodo y sumandolo.

Jupiter34

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!

Oblivi0n

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 )

Ferno

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

Jupiter34

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

Jupiter34

Estoy peleando..Se como sacar el Maximo, peroquiero discriminar entre par o impar...

Como debería hacerlo? No se para donde ir!

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language