Форум программистов, компьютерный форум 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; // Сообщение о конце записи подробнее

Показать сообщение отдельно
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32

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

11.07.2014, 21:21. Просмотров 442. Ответов 4
Метки (Все метки)

Люди, помогите разобраться с рекурсивной функцией обхода бинарного дерева. Бьюсь головой об стену, не могу понять как она работает.

вот метод класса Tree для обхода дерева:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Tree::Print(Subscriber * Node)
{
   if(Node != 0)
   {
      Print(Node->left);
            cout  << Node->FIO;
    (strlen (Node->FIO)<24)?cout<<"\t\t": cout<<"\t";
            cout<< Node->YearOfBirth<<"\t"
                << Node->Town<<"\t"
                << Node->Number<<"\t"
                << endl << endl;
      Print(Node->right);
   }
}
Из всего пройденного мною материала на данный момент - рекурсия - пока самое темное для меня место в ООП. Вышеприведенная функция написана не мной, я так полагаю она является неким шаблоном, в который я добавил свои значения которые нужно выводить, но я не могу вникнуть как она работает в принципе.
Мне нужно к простому выводу данных всего дерева добавить нумерацию списка, но как это сделать в рекурсивной функции не могу понять. Собственно непонимание работы самой рекурсии и приводит к тому, что не знаю как сделать нумерацию.
Если в цикле там все понятно:
C++
1
2
for (int i = 1; i<n; i++)
    cout<<i<<"...."<<endl;
то в рекурсии так не канает.
Решил поэкспериментировать, добавил в класс Tree счетчик Counter, который считает кол-во созданных объектов и попытался его использовать в таком контексте:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void Tree::Print(Subscriber * Node)
{
   if(Node != 0)
   {
      Counter--;
      Print(Node->left);
            cout  <<"   "<<++Counter<<". "<<Node->FIO;
    (strlen (Node->FIO)<24)?cout<<"\t\t": cout<<"\t";
            cout<< Node->YearOfBirth<<"\t"
                << Node->Town<<"\t"
                << Node->Number<<"\t"
                << endl << endl;
      Print(Node->right);
   }
}
Руководствовался домыслами, что пока Print () будет себя вызывать внутри (до момента Node == 0), то счетчик с n-го кол-ва объектов обнулится, а потом при возврате значений из стека в обратном порядке будет увеличиваться на единицу и будет, то, чего я добиваюсь, но при создании не скольких объектов и выводе их на экран все абоненты нумеруются одним и тем же номером:
"2. айлалэ....
2. айнана...."
В общем непонимание того, что ты пишешь или с чем работаешь - это печально
Вот, собственно просьба, просветите неуча как реализовать нумерацию и как вообще понять рекурсию :/
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru