Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Arboles Binarios

Estas en el tema de Arboles Binarios en el foro de C/C++ en Foros del Web. Bueno... Soy Nuevo En El Foro ...Poseo un Código De Arboles binarios , ya logre que arrojara InOrden, PostOrden y PreOrden, Pero Lo que ahora ...
  #1 (permalink)  
Antiguo 08/07/2011, 19:43
 
Fecha de Ingreso: julio-2011
Mensajes: 2
Antigüedad: 13 años, 4 meses
Puntos: 0
Pregunta Arboles Binarios

Bueno... Soy Nuevo En El Foro ...Poseo un Código De Arboles binarios ,
ya logre que arrojara InOrden, PostOrden y PreOrden, Pero Lo que
ahora necesito es Que Me Arroje el resultado del numero de hojas
totales que posee este arbol... Ayuda !!!!

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct nodo
  5. {
  6.    struct nodo *izquierdaPtr;
  7.    int dato;
  8.    struct nodo *derechaPtr;
  9. };
  10.  
  11. typedef struct nodo NODO;
  12. typedef NODO *ARBOLNODOPTR;
  13.  
  14. void insertaNodo(ARBOLNODOPTR *arbolPtr, int valor)
  15. {
  16.  if (*arbolPtr == NULL)
  17.  {
  18.     *arbolPtr = (ARBOLNODOPTR)malloc(sizeof(NODO));
  19.     if (*arbolPtr != NULL)
  20.     {
  21.      (*arbolPtr)->dato = valor;
  22.      (*arbolPtr)->izquierdaPtr = NULL;
  23.      (*arbolPtr)->derechaPtr = NULL;
  24.     }
  25.     else
  26.     {
  27.      printf("%d no insertado. No hay memoria disponible.\n", valor);
  28.     }
  29.  }
  30.  else
  31.  if (valor < (*arbolPtr)->dato)
  32.  {
  33.     insertaNodo(&((*arbolPtr)->izquierdaPtr), valor);
  34.  }
  35.  else
  36.  if (valor > (*arbolPtr)->dato)
  37.     insertaNodo(&((*arbolPtr)->derechaPtr), valor);
  38.     else
  39.     printf("Igual");
  40. }
  41.  
  42. void inOrder(ARBOLNODOPTR arbolPtr)
  43. {
  44.  if (arbolPtr != NULL)
  45.  {
  46.     inOrder(arbolPtr->izquierdaPtr);
  47.     printf("%3d", arbolPtr->dato);
  48.     inOrder(arbolPtr->derechaPtr);
  49.  }
  50. }
  51.  
  52.  
  53.  
  54. void preOrder(ARBOLNODOPTR arbolPtr)
  55. {
  56.  if (arbolPtr != NULL)
  57.  {
  58.     printf("%3d", arbolPtr->dato);
  59.     preOrder(arbolPtr->izquierdaPtr);
  60.     preOrder(arbolPtr->derechaPtr);
  61.  }
  62. }
  63.  
  64. void postOrder(ARBOLNODOPTR arbolPtr)
  65. {
  66.  if (arbolPtr != NULL)
  67.  {
  68.     postOrder(arbolPtr->izquierdaPtr);
  69.     postOrder(arbolPtr->derechaPtr);
  70.     printf("%3d", arbolPtr->dato);
  71.  }
  72. }
  73.  
  74.  
  75. main()
  76. {
  77.  int i, item;
  78.  ARBOLNODOPTR raizPtr = NULL;
  79.  
  80.  for (i=1; i <= 10; i++)
  81.  {
  82.      printf("ingrese elemento: ");
  83.      scanf("%d",&item);
  84.      insertaNodo(&raizPtr, item);
  85.  }
  86.  printf("\n\nEl preOrden es:\n");
  87.  preOrder(raizPtr);
  88.  printf("\n\nEl inOrden es:\n");
  89.  inOrder(raizPtr);
  90.  printf("\n\nEl postOrden es:\n");
  91.  postOrder(raizPtr);
  92.  printf("\n");
  93.  system("pause");
  94. }
  #2 (permalink)  
Antiguo 09/07/2011, 09:47
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Arboles Binarios

Viendo tu metodo:

Código C:
Ver original
  1. void inOrder(ARBOLNODOPTR arbolPtr)
  2. {
  3.  if (arbolPtr != NULL)
  4.  {
  5.     inOrder(arbolPtr->izquierdaPtr);
  6.     printf("%3d", arbolPtr->dato);
  7.     inOrder(arbolPtr->derechaPtr);
  8.  }
  9. }

Cada vez que llegamos a la condicion de que arbolPtr es NULL eso quiere decir que es una hoja. Ahora simplemente deberias returnar un uno idicando que es una hoja. Luego cada llamada recursiva recoje esos valores y simplemente los suma y los devuelve.

Código C:
Ver original
  1. int NumHoja(ARBOLNODOPTR arbolPtr)
  2. {
  3.  if (arbolPtr != NULL)   return ( NumHoja(arbolPtr->izquierdaPtr) +    NumHoja(arbolPtr->derechaPtr) ) ;
  4.  else return 1;
  5. }
  #3 (permalink)  
Antiguo 09/07/2011, 15:29
 
Fecha de Ingreso: julio-2011
Mensajes: 2
Antigüedad: 13 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Arboles Binarios

Cita:
Iniciado por sam90 Ver Mensaje
Viendo tu metodo:

Código C:
Ver original
  1. void inOrder(ARBOLNODOPTR arbolPtr)
  2. {
  3.  if (arbolPtr != NULL)
  4.  {
  5.     inOrder(arbolPtr->izquierdaPtr);
  6.     printf("%3d", arbolPtr->dato);
  7.     inOrder(arbolPtr->derechaPtr);
  8.  }
  9. }

Cada vez que llegamos a la condicion de que arbolPtr es NULL eso quiere decir que es una hoja. Ahora simplemente deberias returnar un uno idicando que es una hoja. Luego cada llamada recursiva recoje esos valores y simplemente los suma y los devuelve.

Código C:
Ver original
  1. int NumHoja(ARBOLNODOPTR arbolPtr)
  2. {
  3.  if (arbolPtr != NULL)   return ( NumHoja(arbolPtr->izquierdaPtr) +    NumHoja(arbolPtr->derechaPtr) ) ;
  4.  else return 1;
  5. }
Muchas Gracias por la ayuda ... Pero Como Quedaria dentro del codigo??... Y Una Vez maz Gracias
  #4 (permalink)  
Antiguo 11/07/2011, 09:11
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Arboles Binarios

La idea de usar la recursion me parece buena, pero la idea de retornar 1 cuando el (sub)arbol es vacio no.

Una mejora a eso es retornar 0 cuando el arbol (o subarbol) es vacio, retornar 1 cuando ambos hijos son null
y retornar
elnumerodehojas( izquierda ) + elnumerodehojas( derecha )

en otro caso.

Etiquetas: arboles, binario, hojas, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:43.