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

"Рекурсивная функция" (Обход бинарного дерева) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Расположить столбцы матрицы в соответствии с ростом характеристик http://www.cyberforum.ru/cpp-beginners/thread102248.html
"Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов. Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик" можете помочь с этим задачом?
C++ [Геометрия]Скалярное произведение векторов Добрый день. Есть вот такая задача: Даны векторы a и b Найти длины этих векторов, их скалярное произведение, а также косинус угла между ними. Предусмотреть возможность ввода данных пользователем, а также получение инструкций (справки) по использованию формул для вычислений. Я написал программу, но не уверен верно ли написал. #include <iostream.h> http://www.cyberforum.ru/cpp-beginners/thread102245.html
C++ Два потока в одной программе
Две фунцкии одной программы оформить как две функции потока. После ввода значений запускаются два требуемых потока, а потом на экран выводится полученные значения. Все функции я написал, работает программа. Не могу понять, как создать 2 потока через CreateThread, а закрыть его еще сложнее т-т Псевдокод: <ввод параметров> *создание потока* -работае кусок программы в потоке...
C++ Как умножить числа…
Доброй ночи Господа! Помогите мне как начинающему программисту умножить два крупных числа, очень надо, вот код (пример): #include "stdafx.h" // #include <iostream> #include <conio.h> #include <windows.h> #include <stdlib.h> #include <stdio.h>
C++ Методы реализации операций над текстом http://www.cyberforum.ru/cpp-beginners/thread102235.html
Не совсем понятны мне алгоритмы, как реализовать такие операции над текстом: Класс-контейнер, который является абстракцией текста и состоит из объектов класса-строки и методов добавления строки к тексту, удаление строки из текста, очистка текста, получения длины самой длинной строки, транслитерации текста, из кириллицы в латиницу, выведение текста
C++ Анимация контролов на winform Возник вопрос - а как под виндой писать анимацию для контроллов (кнопок, окон и прочего) Нормально? =) Вопрос собственно возник изза чего: В MacOSX привык к аниматору - допустим мне нужно, чтобы окно сжалось и куда-то уехало, притом плавно - всего одна строка кода - setFrame:myRect] (по памяти. Именно для окон строчка немного изменяется, этот код как-раз для кнопок и прочего внутри окна) и... подробнее

Показать сообщение отдельно
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
09.03.2010, 12:46  [ТС]     "Рекурсивная функция" (Обход бинарного дерева)
Рекурсивная функция, это функция которая вызыват саму себя

Добавлено через 3 часа 47 минут
Люди, добрые, помjгите разобраться

Добавлено через 22 часа 10 минут
Вот весь код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <windows.h>
#include <conio.h>
 
using namespace std;
 
struct Node{
    int d;
    Node *left;
    Node *right;
};
Node *first(int d);
Node *search_insert(Node *root, int d);
void print_tree(Node *root, int l);
//----------------------------------
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int b[] = {10, 25, 20, 6, 21, 8, 1, 30};
    Node *root = first(b[0]);
    for(int i = 1; i < 8; i++) search_insert(root, b[i]);
    cout << "+" << root->d << "\n\n"; 
    print_tree(root, 0);
    _getch();
    return 0;
}
//----------------------------------
Node *first(int d){
    Node *pv = new Node; 
    pv->d = d;
    pv->left = 0;
    pv->right = 0;
    return pv;
}
//-----------------------------------
Node *search_insert(Node *root, int d){
    Node *pv = root, *prev;
    bool found = false;
    while(pv && !found){
        prev = pv;
        if( d == pv->d) found = true;
        else if(d < pv->d) pv = pv->left;
        else pv = pv->right;
    }
    if(found) return pv;
 
    Node *pnew = new Node;
    pnew->d = d;
    pnew->left = 0;
    pnew->right = 0;
    if(d < prev->d)
        prev->left = pnew;
    else
        prev->right = pnew;
 
    return pnew;
}
//----------------------------------------
void print_tree(Node *p, int level){
    if(p){
        print_tree(p->left, level + 1);     // вывод левого поддерева
        for(int i = 0; i < level; i++) cout << "   ";
        cout << p->d << endl;               // вывод корня поддерева
        print_tree(p->right, level + 1);    // вывод левого поддерева
    }
}
вот результат программы
1
6
8
10
20
25 21
30

Вот как я понимаю как работает функция print_tree:
вызовы:
1) print_tree(10, 0); (лев. часть)
2) print_tree(6, 1); (лев. часть)
3)print_tree (1, 2); (лев. часть)
4)print_tree(нет левого поддерева, 3) (лев. часть)
вывод "1"
5) print_tree (нет правого поддерева, 3); (лев. часть)

все дальше не понятно как выводиться остальная часть поддерева

Добавлено через 5 минут
небольшая поправка:
5) print_tree (нет правого поддерева, 3); (прав. часть)
 
Текущее время: 23:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru