Arboles binarios

Me gustaría saber si me puedes ayudar... Con el
siguiente problemilla...
Bueno debo cargar un archivo de texto .txt en c++ al cual debo contabilizar
el total de las palabras diferentes de este archivo, ademas mostrar inorden las primeras 20 palabras...
Y bueno acá esta tengo como abrir el archivo txt...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main() {
FILE *archivo;
char caracter;
archivo = fopen("c:\prueba.txt","r");
if (archivo == NULL)
{
printf("\nEl archivo no existe \n\n");
getch();
exit(1);
}
else
{
printf("\nEl contenido del archivo de prueba es \n\n");
while (feof(archivo) == 0){
caracter = fgetc(archivo);
printf("%c",caracter);
//getch();
}
}
--------------------------------------------
para contar  las palabras diferentes creo seria así...
**Sumar uno al contador cada vez que antes de una letra alla algún separador de palabras
-----------------------------------------------
y para mostrar inorden las primeras 20 palabras seria asi...
cant=20; //sria la cantidad de palabras q queres mandar (va en el main)
inorden (eaiz,cant);
//////////////////////////////////////////////////////////////
void inorden (struct nodo *r, int cant) //r: raiz
{
inorden (r->izq);
if(cant<0) exit(0);
printf("%s", r->palabra);
cant=cant-1;
inorden(r->der);
}
Bueno amigo experto espero me puedas ayudar ... De como empezar el árbol binario
ya teniendo estos datos... ..

1 respuesta

Respuesta
1
Bueno te diré que según lo que entiendo no necesitas otra cosa que hacer el insertar del árbol binario y otro método que te reconozca las palabras y las vaya insertando en el árbol, el insertar debería ser algo como esto:
void insertar(struct Nodo* r, string nuevapalabra)
{
    if(!r) return;
    if(nuevapalabra < palabra)
   {
       if(hizq)
          insertar(hizq, nuevapalabra);
       else
          Hizq = new Nodo(palabra); // suponiendo que tengas un constructor que reciba la palabra y ponga los hijos del árbol en cero.
}
   else if(nuevapalabra > palabra)
   {
       if(hder)
          insertar(hder, nuevapalabra);
       else
          Hder = new Nodo(palabra); // suponiendo que tengas un constructor que reciba la palabra y ponga los hijos del árbol en cero.
}
}
Y luego que hagas el método que te devuelva las palabras y las metas en el árbol mediante el insertar, ya las vas a tener a tu disposición, con el inorden te las debe imprimir en le orden que quieras. Para saber la cantidad de palabras diferentes basta con saber la cantidad de elementos del árbol, eso lo puedes hacer mediante el inorden también.
Hola amigo gracias por el gran interés en tu respuesta...
Bueno después de unos largos intentos hemos logrado llevar el programa hasta donde
Nos cuenta el total de las palabras diferentes sin embargo,,,, hemos encontrado gran dificutad en el inorden de las de las primeras 20 palabras...
Agrego el código el cual hemos realizado, como también el archivo con el cual estamos
Trabajando ...
Aquí puedes descargar el archivo...
http://cid-96ee94613cf36780.skydrive.live.com/self.aspx/sOfwArE%202008-10-15/prueba.txt
aqui sta el codigo que hemos realizadoooooo...gracias a vuestra ayuda...y dale
en verdad me gustaría saber si me puedes ayudar a culminar el programa teniendo como
base mi código ...gracias por tu atención.....
#include <alloc.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct nodo
 {
  struct nodo *izq, *der;
  char *dato;
 };
int cont=0;
struct nodo *crear(char s[30])
 {
  struct nodo *p;
  p=(struct nodo *) malloc (sizeof(struct nodo));
  p->izq=NULL;
  p->der=NULL;
  p->dato=s;
  return (p);
 }
void insertar(struct nodo *raiz, char s[30])
{
  struct nodo *nuevo,*q,*p;
  nuevo=crear(s);
  q=NULL;
  p=raiz;
  while(p!=NULL && strcmp( p->dato,nuevo->dato)!=0)
   {
     q=p;
     if(strcmp(p->dato,nuevo->dato)<0)
      p=p->izq;
     else
     // if (strcmp(p->dato,nuevo->dato)<0)
       p=p->der;
  }
 if(strcmp(p->dato,nuevo->dato)!=0)
  if(strcmp(q->dato,nuevo->dato)>0)
   q->izq=nuevo;
  else
   q->der=nuevo;
}
cargar()
 {
   struct nodo *raiz=NULL;
   FILE *archivo;
   char caracter[30],espa, tem[30];
   int b=0;
   archivo = fopen("c:\prueba.txt","r");
   if (archivo == NULL)
   {
      printf("\nEl archivo no existe \n\n");
      getch();
      exit(1);
   }
   else
   {
     printf("\nEl contenido del archivo de prueba es \n\n");
     while (feof(archivo) == 0)
     {
      espa=getc(archivo);
     if (espa==' ')
      {
       printf("\n");
           cont++;
      }
         else
      {
       printf("%c",espa);
      }
     b++;
       //  getch();
             //llenar arbol binario
        /*if (raiz==NULL)
         {
              raiz=crear(caracter);
         }
        else
         {
              insertar(raiz,caracter);
         }*/
           // printf("%c",caracter);
     }
     printf("\nEL NUMERO DE PALABRAS ES: %d",cont);
   }
   getch();
   return 0;
 }
 void main()
{
 //struct nodo *raiz=NULL;
 char opc;
 int dato,x,s;
 do
  {
   clrscr();
   gotoxy(27,8);printf("1. Cargar Archivos");
   gotoxy(27,10);printf("2. Contar palabras");
   gotoxy(27,12);printf("3. Mostrar palabras");
   gotoxy(27,20);printf("4. Salir");
   gotoxy(27,22);printf("opcion: []\b\b");
   opc=getche();
   switch(opc)
   {
     case '1':
        clrscr();
        cargar();
     break;
    case '2':
     clrscr();
   printf("EL NUMERO DE PALABRAS ES: %d",cont);
     getch();
    break;
    case '3':
     clrscr();
    // orden(raiz);
     getch();
    break;
    case '4': break;
    default:
      clrscr();
      gotoxy(31,10);printf("La opcion no existe");
      gotoxy(24,12);printf("presione una tecla para continuar...");
      getch();
    break;
   }
  }while(opc!='4');
}
Bueno mira para el inorden para las 20 palabras, tienes que tener una referencia que se vaya modificando a medida que bajas un nivel en el árbol, y cuando llegue a 20 terminas. Es algo como lo siguiente:
void mostrar20(struct nodo *raiz)
{
    int cant = 0;
    inorden(raiz, cant);
}
void inorden(struct nodo *raiz, int& cant)
{
    if(!raiz || cant == 20)
       return;
    printf("palabra %d: %s", ++cant, raiz->dato);
   if(raiz->hIzq)
     inorden(raiz->hIzq, cant);
   if(raiz->hDer)
     inorden(raiz->hDer, cant);
}
El que tienes que llamar en el main es mostrar20.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas