elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda Arboles - C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda Arboles - C  (Leído 3,326 veces)
Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Duda Arboles - C
« 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!

Código
  1. //Mostrar en orden (IRD)
  2. void mostrarOrden (treenode *hoja)
  3. {
  4.    if (hoja!=NULL)
  5.    {
  6.        mostrarOrden(hoja->izq);
  7.        printf("%d ",hoja->dato);
  8.        mostrarOrden(hoja->der);
  9.    }
  10.    return;
  11. }
  12. //Mostrar en preOrden (RID)
  13. void mostrarPreorden(treenode *hoja)
  14. {
  15.        if (hoja!=NULL)
  16.    {
  17.        printf("%d ",hoja->dato);
  18.        mostrarPreorden(hoja->izq);
  19.        mostrarPreorden(hoja->der);
  20.    }
  21.    return;
  22.  
  23. }
  24. //mostrar en posOrden (IDR)
  25. void mostrarPosorden(treenode *hoja)
  26. {
  27.        if (hoja!=NULL)
  28.    {
  29.        mostrarPosorden(hoja->izq);
  30.        mostrarPosorden(hoja->der);
  31.        printf("%d ",hoja->dato);
  32.    }
  33.    return;
  34.  
  35. }
  36. //Calcula profundidad del arbol
  37. int profundidad(treenode *hoja)
  38. {
  39.    if(hoja==NULL)
  40.    return 0;
  41.    else{
  42.    int profI=profundidad(hoja->izq);
  43.    int profD=profundidad(hoja->der);
  44.  
  45.    if(profI>profD)
  46.    return profI+1;
  47.    else
  48.    return profD+1;
  49.    }
  50. return;
  51. }
  52. /*
  53. //Buscar nodo
  54. treenode *busqueda(treenode *hoja, int busq)
  55. {
  56.     if(hoja==NULL)
  57.     return 0;
  58.     else
  59.     if(busq==hoja->dato)
  60.     return hoja;
  61.  
  62.     if(busq<hoja->dato)
  63.     {
  64.         return busqueda(hoja->izq,busq);
  65.     }else{
  66.         return busqueda(hoja->der,busq);
  67.     }
  68. return;
  69. }
  70. */
  71. //Cuenta nodos impares
  72. int contarImp(treenode *hoja){
  73.    if (hoja!=NULL)
  74.    {
  75.        contarImp(hoja->izq);
  76.        int cuenta=cuenta+(hoja->dato%2==0);
  77.        contarImp(hoja->der);
  78.        return cuenta;
  79.    }
  80.  
  81. }
  82.  

Me podrian dar una mano?

Como siempre, mil gracias!!

Saludos para todos!


En línea

Oblivi0n


Desconectado Desconectado

Mensajes: 392

Odio las ranas.


Ver Perfil
Re: Duda Arboles - C
« Respuesta #1 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.


« Última modificación: 9 Noviembre 2012, 22:53 pm por Oblivi0n » En línea

Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Duda Arboles - C
« Respuesta #2 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!
En línea

Oblivi0n


Desconectado Desconectado

Mensajes: 392

Odio las ranas.


Ver Perfil
Re: Duda Arboles - C
« Respuesta #3 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 )
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Duda Arboles - C
« Respuesta #4 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
En línea

Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Duda Arboles - C
« Respuesta #5 en: 9 Noviembre 2012, 23:20 pm »

Listo chicos! Muchas gracias!!

Asi quedo!

Código
  1. //Cuenta nodos impares
  2. int contarImp(treenode *hoja,int imp){
  3.  
  4.    if (hoja!=NULL)
  5.    {
  6.        if(hoja->dato%2!=0)
  7.        {
  8.        imp++;
  9.        }
  10.        return contarImp(hoja->izq,imp);
  11.        return contarImp(hoja->der,imp);
  12.    }
  13.    return imp;
  14. }

Y el dato importante..en la llamada...

Código
  1. impar=contarImp(arb,imp+1);

El +1
En línea

Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Duda Arboles - C
« Respuesta #6 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!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda Arboles - C
« Respuesta #7 en: 23 Noviembre 2012, 02:05 am »

Código
  1. //Cuenta nodos impares
  2. int contarImp(treenode *hoja,int imp){
  3.  
  4.    if (hoja!=NULL)
  5.    {
  6.        if(hoja->dato%2!=0)
  7.        {
  8.        imp++;
  9.        }
  10.        return contarImp(hoja->izq,imp);
  11.        return contarImp(hoja->der,imp);
  12.    }
  13.    return imp;
  14. }

Y el dato importante..en la llamada...

Código
  1. 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:
Código
  1. return contarImp(hoja->izq,imp);
  2. return contarImp(hoja->der,imp); /* <== Nunca se ejecuta */

Para contar el numero de valores impares puedes utilizar, por ejemplo:
Código
  1. int contarImp(treenode *p)
  2. {
  3.   return p == NULL ? 0 : p->dato % 2 + contarImp(p->izq) + contarImp(p->der);
  4. }

Un saludo
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arboles en Java
Java
vbajo 1 18,200 Último mensaje 19 Diciembre 2006, 22:54 pm
por Ragnarok
listas y arboles
Java
Growdes 4 6,633 Último mensaje 11 Septiembre 2009, 19:54 pm
por Skeletron
Arboles generales
Java
kattysol7 2 7,717 Último mensaje 7 Mayo 2010, 01:00 am
por kattysol7
Arboles binarios
Programación C/C++
josue_tux 3 10,359 Último mensaje 9 Mayo 2010, 20:18 pm
por leogtz
Arboles BST
Java
kanon_feeb 1 2,743 Último mensaje 9 Mayo 2012, 14:40 pm
por raul_samp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines