Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++]Бинарное дерево используя классы 
:(
    Опции темы
Катюшка512
Дата 12.12.2009, 20:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



Исользуя классы создать бинарное дерево. В качестве ключа использовать целое число. Записи бинарного дерева содержат указатель на строку,которая является именем файла, в файлах содержится текст. Реализовать функцию, которая для поддерева максимальной длинны выводит на экран содержимое файлов, имена которых оканчиваются на ".asm". В строке выводить не более 60 символов, переход на новую строку выполнять на месте пробела. Перед выводом в первой строке с 30-1 по 40-ю вывести имя файла, а в позиции с 40-й по 52-ю вывести текущую дату (дд.мм.гг). Реккурсии не использовать Другие элементы записи бинарного дерева можно самим объявлять и создавать. Записей в бинарном дереве должно быть не менее 10..

Мальчики,помогите,пожалуйста, совсем не понимаю как к этому подступиться :(..
С меня шоколадка;)
PM MAIL   Вверх
Катюшка512
Дата 13.12.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



я начала вот так а как дальше?

Код
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>

class btree {
public:
      int key;
      int count;
      char link [256];
    //  char [20] str;
      btree *left;
      btree *right;
};


btree *first () {
btree *pv=new (btree);
(*pv).count=1;
pv->left=NULL;
pv->right=NULL;
pv->key=100;
return(pv);

}

void main()
{
btree *a;

getch();
}

PM MAIL   Вверх
Катюшка512
Дата 19.12.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



Код
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>

using namespace std;

class btree {
public:
      int key;
      char link [256];
      btree *left;
      btree *right;
 };

btree first(btree *root,int val)//,char str)
{
root->key=val;
//strcpy(pv->link,str);
root->left=NULL;
root->right=NULL;
root->key=100;
return (*root);
}

btree AddLeaf(btree *root,int val)
{
if (root==NULL) *root=first(root,val) ;
 if (val<root->key)
   if (NULL==root->left)
     first(root->left,val);
   else
    AddLeaf(root->left,val);
if (val>root->key)
 if (NULL==root->right)
    first(root->right,val);
 else
    AddLeaf(root->right,val) ;
return *root;
}

void print_tree(btree *root)
{

}

void main()
{
char c;
int i;
btree *a;
first(a,20);
for (i=0;i<10;i++)
  AddLeaf(a,random(50));
getch();
}


компилируется но на строчке 
Код

root->key=val;
 


выбивает ошибку Acess violation to adress ...
????
PM MAIL   Вверх
t_gran
Дата 21.12.2009, 04:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Вот, поправил ваш код. Вы совсем забыли про выделение памяти, а ещё не правильно передаёте указатель через параметр.
Код

#include <iostream>
#include <string.h>

using namespace std;

struct btree
{
   int key;
   char link [256];
   btree *left;
   btree *right;
};

//----------------------------------------------//
// Используем 2-ой указатель, т.к. при использовании 1-го указателя,
// вы просто копируете адрес на каторый вы ссылаетесь, в результате
// при выходе из ф-ии новый адрес теряется. Он не может быть сохранёт
// в 'btree *root'.
btree *First(btree **root, int val)
{
   // Обязательно выделяем память
   (*root)= new btree;
   (*root)->key= val;
   (*root)->left= NULL;
   (*root)->right= NULL;
   return *root;
}
//----------------------------------------------//
btree *AddLeaf(btree *root, int val)
{
   if (root == NULL)
      root= First(&root, val);
   else
   {
      if (val < root->key)
      {
         if (root->left == NULL)
            First(&(root->left), val);
         else
            AddLeaf(root->left, val);
      }
      if (val > root->key)
      {
         if (root->right == NULL)
            First(&(root->right), val);
         else
            AddLeaf(root->right, val);
      }
   }
   return root;
}
//----------------------------------------------//
void Print(btree *root)
{
   if (root)
   {
      cout << root->key << " ";
      Print(root->left);
      Print(root->right);
   }
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   btree *a;
   First(&a, 20);
   for (int i=0;i<10;i++)
     AddLeaf(a, rand()%50);
   Print(a);
   return 0;
}


Для добавления в дерево предлагаю свою функцию, менее наглядную, но более универсальную. В результате ф-ия First становится ненужной:
Код

btree *Insert (btree **theTree, int theKey, const char *theLink)
{
   btree **node= theTree;
   while (*node && theKey != (*node)->key)
      if (theKey < (*node)->key)
         node= &((*node)->left);
      else
         node= &((*node)->right);
   if (!(*node))
   {
      *node= new btree;
      (*node)->key= theKey;
      strcpy((*node)->link, theLink);
      (*node)->right= (*node)->left= NULL;
   }
   return *theTree;
}


Это сообщение отредактировал(а) t_gran - 21.12.2009, 05:23


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Laser
Дата 22.12.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.12.2009

Репутация: нет
Всего: нет



Уважаемый, t_gran!!! Я вижу, что Вы мастер своего дела, а я вот... новичок... Помогите пожалуйста с заданием:
"Определит, входит ли элемент Е в дерево Т" больше ничего не сказано. Как  я понял, нужно задать дерево допустим целых чисел, заполненное любым способом (возможно рандомом), с клавиатуры вводится элемент, скажем "2" и прога ищет его. Есть такой - отлично, появляется сообщение, что такой элемент присутствует, нету - ну и нету, выдаётся соответствующий текст...
PM MAIL   Вверх
Энжи
Дата 23.12.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



t_gran, спасибо за ответ....позаимствовала предложенную Вами функцию...в итоге получилось :

Код
#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
using namespace std;

struct btree
{
   int key;
   char link [256];
   btree *left;
   btree *right;
};

//----------------------------------------------//

btree *First(btree **root, int val)
{
   // Обязательно выделяем память
   (*root)= new btree;
   (*root)->key= val;
   (*root)->left= NULL;
   (*root)->right= NULL;
   return *root;
}
//----------------------------------------------//
btree *AddLeaf(btree *root, int val)
{
   if (root == NULL)
      root= First(&root, val);
   else
   {
      if (val < root->key)
      {
         if (root->left == NULL)
            First(&(root->left), val);
         else
            AddLeaf(root->left, val);
      }
      if (val > root->key)
      {
         if (root->right == NULL)
            First(&(root->right), val);
         else
            AddLeaf(root->right, val);
      }
   }
   return root;
}

btree *Insert (btree **theTree, int theKey, const char *theLink)
{
   btree **node= theTree;
   while (*node && theKey != (*node)->key)
      if (theKey < (*node)->key)
         node= &((*node)->left);
      else
         node= &((*node)->right);
   if (!(*node))
   {
      *node= new btree;
      (*node)->key= theKey;
      strcpy((*node)->link, theLink);
      (*node)->right= (*node)->left= NULL;
   }
   return *theTree;
}

btree MaxTreeLength(btree * tree)
{

}

void TextFind(btree * root)
{
 FILE *f;
 struct date d;
 char text[4],c;
 int i,j;
 strcpy(text,"");
 i=strlen(root->link)-4;
 getdate(&d);
 strcat(text,&root->link[i]);
 cout<<"\n Text:"<<text<<"\n";
 if (strcmp(text,".asm")==0)
  if  ((f=fopen(root->link,"rt"))==NULL)
    cout <<"File "<<root->link<<" doesn't exist";
   else
   {
    i=0;
    while (i!=52)
      {
        if (i==30)
         {
          if (strlen(root->link)>10)
           {
            for (j=0;j<6;j++)
             {
              cout<<root->link[j];
              i++;
             }
             cout<<"~.asm";
             i=i+j;
           }
          else
             {
              cout<<root->link;
              i=i+strlen(root->link);
             }
         }
        if (i==40)
         {
           cout<<d.da_day<<";"; //непонятно что выводит
           cout<<d.da_mon<<";"; //
           cout<<d.da_year<<"\n";
           i=i+8;
         }
        cout<<" ";
        i++;
      }

    j=0;
    while (!feof(f))
      {
       if (j==60)
           {
            j=-1;
            while (fgetc(f)!=' ')
             {
              c=fgetc(f);     //пробелы в начале строки???
              putchar(c);
             }
           cout<<"\n";
           }
        c=fgetc(f);
        putchar(c);
       j++; 
      }
   fclose(f);

   }
  }
//----------------------------------------------//
void Print(btree *root)
{
   if (root)
   {
      cout << root->key << " " <<root->link<<"\n";
      Print(root->left);
      Print(root->right);
   }
}

//----------------------------------------------//
int main (int argc, char **argv)
{
   btree *a;
   char str[256];
   a=new btree;
   for (int i=0;i<10;i++)
      {
      cout<<"Enter file name : ";
      cin.getline(str,256);
      Insert(&a,rand()%50,str);
//     AddLeaf(a, rand()%50);
      }
   Print(a);
   TextFind(a->left);
   getch();
   return 0;
}

//---------------------------------------------------------------------------
 


Не могу разобраться со следующими проблемами:
- при создании корня (первого элемента дерева) записывает мусор...отсутствует инициализация??
- при выводе текстового файла в начале первой строки выползают лишние пробелы...
- дату выводит непонятно каким образом, а точнее -  _;%;1972....откуда?? пример по выводу даты взяла из хелпа по билдеру...
- и самое главное не могу сообразить, как организовать поиск поддрева...вроде и понятно - направо, налево..а как запоминать маршрут??....:(.... 

думаю мою функцию TextFind можно рационализировать и разбить на несколько, но это детали, может еще придумаю что-нибудь...не сильно критикуйте smile....главное сейчас понять, как реализовать поиск поддрева...
надеюсь на Вашу подсказку ;)...спасибо заранееsmile
PM MAIL   Вверх
t_gran
Дата 24.12.2009, 04:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Уважаемый Laser, с радостью вам помогу, но для этого вы должны создать свою тему. Дело в том, что модераторы (да и я в частности) не приветствуют когда образуется в одной теме каша вопросов и ответов.

1.
-------------------------------------------------------------------------------------------------
Цитата

- при создании корня (первого элемента дерева) записывает мусор...отсутствует инициализация??

Правильно, и будет записывать мусор. Дело в том, что если вы используете ф-ию Insert, то изночально, при инизиализации вы должны обнулить указатель, но выделять память под него не нужно:
Код

btree *a= NULL; // И всё, память не нужно выделять, это выполняет ф-ия Insert 


2.
-------------------------------------------------------------------------------------------------
Цитата

- при выводе текстового файла в начале первой строки выползают лишние пробелы...

Ох и намудрили же Вы! smile Но самое интересно, что работает. Правда время пришлось закоментить.  А на счёт пробелов, так это, уже вы сами в программе в цикле пишете:
Код

   while (i!=52)
   {
      // ...
      cout<<" ";
      i++;
   }

Вы после этого цикла поставе cout << endl и вывод информации начнётся нормально, с начала строки. smile Я к тому, что лучше контролируйте вывод нужных вам пробелов. Сам не буду править, т.к. детально не углублялся в постановку вашей задачи, что в результате может привести к дезинформации.

3.
-------------------------------------------------------------------------------------------------
Цитата

- дату выводит непонятно каким образом, а точнее -  _;%;1972....откуда?? пример по выводу даты взяла из хелпа по билдеру...

Повторюсь, с Builder-ом ничего общего не имею. Советую воспользоваться ф-ми оперирующими с типом time_t. Вот готовый пример  работы со временем.

4.
-------------------------------------------------------------------------------------------------
Цитата

и самое главное не могу сообразить, как организовать поиск поддрева...вроде и понятно - направо, налево..а как запоминать маршрут??....:(.... 

Зачем? Я не понял. Если вам нужно помнить позицию, то просто в функции возвращайте указатель на найденную вершину и всё. А потом "скармливаете" её другой ф-ии которая и будет в дальнейшем вести обработку данного поддерева.

P.S.: Чтобы проблем с функциями не возникало советую скачать шикарный справочник: Полный справочник по С (Герберд Шилдт)



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 26.12.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



t_gran, спасибо за Ваше терпение и ответыsmile...все пункты теперь работают как надо, хотелось бы только уточнить насчет пункта 4 :

Цитата

Зачем? Я не понял. Если вам нужно помнить позицию, то просто в функции возвращайте указатель на найденную вершину и всё. А потом "скармливаете" её другой ф-ии которая и будет в дальнейшем вести обработку данного поддерева.


вы имеете ввиду что-то вроде такого:

Код

 while ((root->left!=NULL)&&(root->right!=NULL)) // или while (root) ?
   {
      if (root->left==NULL) TextFind(root->right);
      else
      if (root->right==NULL) TextFind(root->left)
    }


или не совсем??

PM MAIL   Вверх
t_gran
Дата 28.12.2009, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Хм.. Теперь я начал вроде понимать суть вопроса. smile Если вам просто надо найти элемент, то можно воспользоваться следующим кодом:
Код

btree *Find (btree *theTree, int theKey)
{
   if (!theTree)
      return NULL;
   else if (theTree->key < theKey)
      return Find(theTree->right, theKey);
   else if (theTree->key > theKey)
      return Find(theTree->left, theKey);
   else
      return theTree;
}

Как вы видите поиск будет осуществляться по ключу theKey. Результатом будет указатель на найденную вершину, иначе возвратит NULL.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 28.12.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



t_gran,  спасибо за идею,позаимствовала предложенную Вами функциюsmile...в итоге возвращает указатель всегда на первую вершину, дальше не идет smile ...полагаю что это вызвано с отсутсвием условия равенства параметра theKey (ведь в начале идет сравнение первого элемента с первым или не так smile ?? ).. но при замене > на >= и < на <= стало выдавать ошибку памяти...я немного переделала Вашу функцию smile , может я в переделке косяк наделала??
код переделанной :
Код

btree *Find (btree **theTree, int theKey)
{
  btree **node= theTree;
   if (!node)
      return NULL;
   else if ((*node)->key < theKey)
     {
      node= &((*node)->right);
      return Find(node, theKey);
     }
   else if ((*node)->key >= theKey)
     {
      node= &((*node)->left);
      return Find(node, theKey);
     }
   else
      return *theTree;
}


построила ориентируясь на предложенную ранее Вами функцию *Insert..
код вызова *Find такой :
Код

    while ((Find(&a,a->key))!=NULL)
       {
        TextFind(a);
       } ;


Весь код программы:
Код

#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
using namespace std;

struct btree
{
   int key;
   char link [256];
   btree *left;
   btree *right;
};

//----------------------------------------------//

btree *First(btree **root, int val)
{
   // Обязательно выделяем память
   (*root)= new btree;
   (*root)->key= val;
   (*root)->left= NULL;
   (*root)->right= NULL;
   return *root;
}
//----------------------------------------------//
btree *AddLeaf(btree *root, int val)
{
   if (root == NULL)
      root= First(&root, val);
   else
   {
      if (val < root->key)
      {
         if (root->left == NULL)
            First(&(root->left), val);
         else
            AddLeaf(root->left, val);
      }
      if (val > root->key)
      {
         if (root->right == NULL)
            First(&(root->right), val);
         else
            AddLeaf(root->right, val);
      }
   }
   return root;
}



void TextFind(btree * root)
{
 FILE *f;
// struct date d;
 time_t    now;
 struct tm  *ts;
 now = time(NULL);
 ts = localtime(&now);
 char text[4],c, buf[80];
 int i,j;
 strftime(buf, sizeof(buf), "%d:%m:%Y", ts);
 strcpy(text,"");
 i=strlen(root->link)-4;
// getdate(&d);
 strcat(text,&root->link[i]);
// cout<<"\n Text:"<<text<<"\n";
 if (strcmp(text,".asm")==0)
  if  ((f=fopen(root->link,"rt"))==NULL)
    cout <<"File "<<root->link<<" doesn't exist";
   else
   {
    i=0;
    while (i!=52)
      {
        if (i==30)
         {
          if (strlen(root->link)>10)
           {
            for (j=0;j<6;j++)
             {
              cout<<root->link[j];
              i++;
             }
             cout<<"~.asm";
             i=i+j;
           }
          else
             {
              cout<<root->link;
              i=i+strlen(root->link);
             }
         }
        if (i==40)
         {
         printf("%s\n", buf);
/*           cout<<d.da_day<<";"; //непонятно что выводит
           cout<<d.da_mon<<";"; //
           cout<<d.da_year<<"\n";
           i=i+8;
*/
         }
        cout<<" ";
        i++;
      }

    j=0;
    cout<<"\n";
    while (!feof(f))
      {
       if (j==60)
           {
            j=-1;
            while (fgetc(f)!=' ')
             {
              c=fgetc(f);
              putchar(c);
             }
           cout<<"\n";
           }
        c=fgetc(f);
        putchar(c);
       j++;
      }
   fclose(f);
   cout<<"\n";
   }
  }
//----------------------------------------------//
void Print(btree *root)
{
   if (root)
   {
      cout << root->key << " " <<root->link<<"\n";
      Print(root->left);
      Print(root->right);
   }
}

btree *Find (btree **theTree, int theKey)
{
  btree **node= theTree;
   if (!node)
      return NULL;
   else if ((*node)->key < theKey)
     {
      node= &((*node)->right);
      return Find(node, theKey);
     }
   else if ((*node)->key >= theKey)
     {
      node= &((*node)->left);
      return Find(node, theKey);
     }
   else
      return *node;
}

btree *Insert (btree **theTree, int theKey, const char *theLink)
{
   btree **node= theTree;
   while (*node && theKey != (*node)->key)
      if (theKey < (*node)->key)
         node= &((*node)->left);
      else
         node= &((*node)->right);
   if (!(*node))
   {
      *node= new btree;
      (*node)->key= theKey;
      strcpy((*node)->link, theLink);
      (*node)->right= (*node)->left= NULL;
   }
   return *theTree;
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   char str[256];
   int i;
   btree *a= NULL;
   for (i=0;i<10;i++)
      {
      cout<<"Enter file name : ";
      cin.getline(str,256);
      Insert(&a,rand()%50,str);
      }
    while ((Find(&a,a->key))!=NULL)
       {
        TextFind(a);
       } ;
 //  Print(a);
//   TextFind(a->left);
   getch();
   return 0;
}



Обобщу вышесказанное, выделив проблему - нет перехода на следующую вершину..Заранее спасибо за ответ

P.s. сегодня сиделала пыталась еще что-то сделать - безрезультатно..и вспомнила что по условию нельзя пользоваться рекурсиями...((..функция Find не подойдет...

Это сообщение отредактировал(а) Энжи - 29.12.2009, 21:04
PM MAIL   Вверх
t_gran
Дата 30.12.2009, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Наконец-то у меня появилось свободное время. В общем, вы немного не правы, но виной этому являюсь непосредственно я.  Дело в том, что только сейчас я прочитал, что нужно пробежаться по самой длинной ветке. В итоге вот, что у меня получилось:
Код

#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>

using namespace std;

struct btree
{
   int key;
   char link [256];
   btree *left;
   btree *right;
};

//----------------------------------------------//
btree *Insert (btree **theTree, int theKey, const char *theLink)
{
   btree **node= theTree;
   while (*node && theKey != (*node)->key)
      if (theKey < (*node)->key)
         node= &((*node)->left);
      else
         node= &((*node)->right);
   if (!(*node))
   {
      *node= new btree;
      (*node)->key= theKey;
      strcpy((*node)->link, theLink);
      (*node)->right= (*node)->left= NULL;
   }
   return *theTree;
}
//----------------------------------------------//
void TextFind(btree * root)
{
 FILE *f;
// struct date d;
 time_t    now;
 struct tm  *ts;
 now = time(NULL);
 ts = localtime(&now);
 char text[4],c, buf[80];
 int i,j;
 strftime(buf, sizeof(buf), "%d:%m:%Y", ts);
 strcpy(text,"");
 i=strlen(root->link)-4;
// getdate(&d);
 strcat(text,&root->link[i]);
// cout<<"\n Text:"<<text<<"\n";
 if (strcmp(text,".asm")==0)
  if  ((f=fopen(root->link,"rt"))==NULL)
    cout <<"File "<<root->link<<" doesn't exist";
   else
   {
    i=0;
    while (i!=52)
      {
        if (i==30)
         {
          if (strlen(root->link)>10)
           {
            for (j=0;j<6;j++)
             {
              cout<<root->link[j];
              i++;
             }
             cout<<"~.asm";
             i=i+j;
           }
          else
             {
              cout<<root->link;
              i=i+strlen(root->link);
             }
         }
        if (i==40)
         {
         printf("%s\n", buf);
/*           cout<<d.da_day<<";"; //непонятно что выводит
           cout<<d.da_mon<<";"; //
           cout<<d.da_year<<"\n";
           i=i+8;
*/
         }
        cout<<" ";
        i++;
      }
    j=0;
    cout<<"\n";
    while (!feof(f))
      {
       if (j==60)
           {
            j=-1;
            while (fgetc(f)!=' ')
             {
              c=fgetc(f);
              putchar(c);
             }
           cout<<"\n";
           }
        c=fgetc(f);
        putchar(c);
       j++;
      }
   fclose(f);
   cout<<"\n";
   }
  }
//----------------------------------------------//
void Print(btree *root)
{
   if (root)
   {
      cout << root->key << " " <<root->link<<"\n";
      Print(root->left);
      Print(root->right);
   }
}
//----------------------------------------------//
int LenSubTree(btree *theTree, int theLen= 0)
{
   if (!theTree)
      return theLen;
   theLen++;
   int left= LenSubTree(theTree->left, theLen);
   int right= LenSubTree(theTree->right, theLen);
   return left < right ? right : left;
}
//----------------------------------------------//
btree *MaxSubTree(btree *theTree)
{
   if (!theTree)
      return NULL;
   return LenSubTree(theTree->left) > LenSubTree(theTree->right) ? theTree->left : theTree->right;
}
//----------------------------------------------//
int main (int argc, char **argv)
{
   srand(time(NULL));
   char str[256];
   int i;
   btree *a= NULL;
   for (i=0;i<10;i++)
   {
      cout<<"Enter file name : ";
      cin.getline(str,256);
      Insert(&a, rand()%50,str);
   }
   btree *b= a;
   while (b= MaxSubTree(b))
   {
      TextFind(b);
   };
   getch();
   return 0;
}

Изменения следующие:
1. Убраны ф-ии First и AddLeaf (они не нужны)
2. Убрана ф-ия Find, т.к. она всего лишь ищет узел по ключу
3. Добавлено 2-е ф-ии LenSubTree и MaxSubTree. Первая, определяет длину дерева, а вторая, возвращает максимальное по длине поддерево.

В результате этого программа работает исходя из поставленных требований.

P.S.: Желаю удачи! smile

Это сообщение отредактировал(а) t_gran - 30.12.2009, 05:11


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Энжи
Дата 30.12.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 12.12.2009

Репутация: нет
Всего: нет



t_gran, гиганстское спасибо за ашу помощь!да, теперь программа делает так как надо. правда нельзя было использовать рекурсии, но думаю преподаватель простит это маленькое отступлениеsmile
t_gran - Вы самый лучший!Еще раз спасибоsmile Бусь-Бусь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.