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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсия и бинарные деревья, обход по ЛКП 
:(
    Опции темы
freed0m
Дата 3.12.2004, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, беда у меня что-то я с этой рекурсией не могу разобратьсяsmile(( Читал в книге смысл в том что функция вызывает сама себя и потом столько же раз обратно.. и как-то везде по-разному сформулировано.. просто каша в голове.... Не могли бы Вы мне объяснить на примере распечатки по ЛКП бинарного дерева, вот структура:

Код

struct TreeNode {
             int item;         // The data in this node.
             TreeNode *left;   // Pointer to the left subtree.
             TreeNode *right;  // Pointer to the right subtree.
          }

а вот сама рекурсивная функция по ЛКП:

Код

void inorderPrint( TreeNode *root ) {
          if ( root != NULL ) {  
          inorderPrint( root->left );  
          cout << root->item << " ";    
          inorderPrint( root->right );
       }
    }

То есть мы идем сначала до конца налево.. это единственное что я тут понял.. а как выполняется распечатка корня и ход направо не понял.. то есть мне не понятно как может вообще выполняться код ниже inorderPrint( root->left ); это же все в одном If встроено... вообщем проясните если кто сможет. И какой тут порядок действий будет...Заране благодарен!
PM MAIL   Вверх
sergejzr
Дата 3.12.2004, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Попробую объяснить smile
Представьте себе, что функций inorderPrint на самом деле бесконечное количество



То есть как только мы добрались до вызова, мы не начинаем сначала функции, а выполняем новую smile

Ждём пока она закончится, а потом выполняем нашу до конца smile

ПС:
Всё дело в том, что функция существует как обьект и мы имеем указатель на неё, поетому можем выполнять её бесконечное количество раз smile





--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Fantasist
Дата 3.12.2004, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


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

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



Ну вот допустим, у тебя такое дерево:

Код

     1
   /   \
  2    3
 /\   /\
4  5  6 7


Вызовы будут происходить так:

Код

inorderPrint(node1)    
   inorderPrint(node2) //node1->left
      inorderPrint(node4) //node2->left
          inorderPrint(NULL) //node4->left    
          cout << node4->item << " ";    
          inorderPrint(NULL) //node4->right  

      cout << node2->item << " ";    

      inorderPrint(node5) //node2->right
          inorderPrint(NULL) //node5->left    
          cout << node5->item << " ";    
          inorderPrint(NULL) //node5->right  
   
   cout << node1->item << " ";    

   inorderPrint(node3) //node1->right
      inorderPrint(node6) //node3->left
          inorderPrint(NULL) //node6->left    
          cout << node6->item << " ";    
          inorderPrint(NULL) //node6->right  

      cout << node3->item << " ";    

      inorderPrint(node7) //node3->right
          inorderPrint(NULL) //node7->left    
          cout << node7->item << " ";    
          inorderPrint(NULL) //node7->right  


Это сообщение отредактировал(а) Fantasist - 3.12.2004, 22:49


--------------------
Волны гасят ветер...
PM MAIL   Вверх
S.A.P.
Дата 3.12.2004, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Просто пойми, что TreeNode - это не дерево, а только узел, причем тип узла. Дерево строиться в памяти динамически из объектов типа TreeNode (их много). Узлы связываются между собой через указатель Left и Right c другими узлами, а те в свою очередь тоже имеют указатели на узлы.

Теперь о рекурсии. Уясни для себя, что парамерты функций (в данном случае - это указатель на один из узлов) заносятся в стек друг за другом. Поэтому, если мы вызовем из inorderPrint еще один inorderPrint, то старый параметр сохраняется, но на верхушке стека теперь будет новый указатель, а когда фукция завершиться, стек сдвинется назад, и мы опять получаем преждние параметры.

Вощем здесь объяснить невозможно, нужно самому понять. Можешь нарисовать на листке бумаги дерево и глядя на алгоритм пальцем водить по узлам, отмечая для себя в каком порядке они обрабатываются. А если затруднения с функцией, то можно записывать, что заносится в стек.
PM MAIL   Вверх
po-her
Дата 3.12.2004, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я вот всегда, когда непонятна программа и ход действий, пытаюсь нарисовать как она работает.
Намного легче понять особенно со структурами. Все видно сразу: что куда идет и что за чем следует!
PM MAIL   Вверх
freed0m
Дата 3.12.2004, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое всем спасибо !!!!! Очень помогли
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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