Форум программистов, компьютерный форум CyberForum.ru

Разобраться с рекурсивной функцией обхода бинарного дерева - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Свой компаратор для контейнера set http://www.cyberforum.ru/cpp-beginners/thread1226205.html
Здравствуйте! Код следующий (комменты): #include <stdlib.h> #include <stdio.h> #include <set> using namespace std; // структура state, содержит массив с двумя элементами и компаратор
C++ Добавить данные в файл С начале программы (игры) вводится имя игрока, которое записывается в файл. Затем игра и счет (int). Как записать этот счет в тот же файл? http://www.cyberforum.ru/cpp-beginners/thread1226204.html
C++ Зачем в классе private?
Объясните пожалуйста кто-нибудь зачем в классе private? что он делает? и почему его не в public поставить зачем приват? Тексты надо перепечатывать внутрь сообщения!
C++ Как вывести несовпадающие элементы массива ?
вывести элементы массива t, которые не совпадают с элементами в массиве p for (i = 0; i < m; i++) { for(j = 0; j < n; j++) { if (*(p+i)!=(*t+j)) { cout <<*(t+i) << ' '; break; }
C++ Тернарный оператор - найти ошибку в коде http://www.cyberforum.ru/cpp-beginners/thread1226164.html
Не пойму почему выдает ошибку, вроде программы самые простые и ошибиться то негде: #include<iostream> using namespace std; int main() { double a,b; bool state; cout<<"a= "; cin>>a; cout<<"b= ";
C++ Ошибка в коде(программа с вектором выполняется только если вызвать её второй раз) Сабж: void vInit() { vInputing(); // Ввод вектора vector_Size = names.size(); cout << "Ваш вектор names: " << endl; for (i; i < vector_Size; i++) { cout << i + 1 << ": " << names << endl; // Вывод вектора } cout << "end" << endl; // Сообщение о конце записи подробнее

Показать сообщение отдельно
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
11.07.2014, 22:32     Разобраться с рекурсивной функцией обхода бинарного дерева
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Print(Subscriber * Node)
{
   if(Node != 0)
   {
      Print(Node->left);           
      Print(Node->right);
   }
 
    static int counter;
 
    cout<<counter;
    counter++;
 
    cout  << Node->FIO;
        (strlen (Node->FIO)<24)?cout<<"\t\t": cout<<"\t";
        cout<< Node->YearOfBirth<<"\t"
        << Node->Town<<"\t"
        << Node->Number<<"\t"
        << endl << endl;
    return;
}
Добавлено через 18 минут
чего-то проглядел
C++
1
2
3
4
5
6
7
if(Node != 0)
    {
        Print(Node->left);           
        Print(Node->right);
    }
    else
        return;
Добавлено через 29 минут
смысл в том,что у тебя есть обработчик(Print()) данных для любого "нода". Мы его и вызываем для корневого узла. А у корневого узла есть еще список потомков(идентичных по структуре(!) предку). Почему бы не вызвать для каждого потомка "обработчик данных для любого "нода"? И почему бы этот вызов не зашить в "обработчик для любого нода"? (Print() внутри Print()) А когда оказываешься в потомке, то оказывается и у него есть потомки почему бы не вызвать мега обработчик и для них, к тому же в нем (обработчике) уже зашит хитрый механизм обработки потомков... И так "гоняешься за хвостом", пока не дойдешь до критерия, когда надо вызывать return
C++
1
(if(Node != 0))
, а не Print(). Например потомок-то нулевой и у него не то что своих потомков нет, самого то его нет.

А до того как вызвать return, надо что-нибудь сделать с данными узла. Или что нибудь сделать до обхода потомков, но обязательно до return.

Главное в рекурсии что бы стек не лопнул... А то каждый вызов пихает свои параметры и все без return-а ...
 
Текущее время: 07:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru