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

Как создать двоичное дерево, элементы которого заполняются по слоям слева направо? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Написать псевдокод алгоритма решения задачи: http://www.cyberforum.ru/cpp-beginners/thread862985.html
Определить в какой четверти или на осях находится точка(x,y)
C++ Дерево ( программу которая находит число ветвей от корня до ближайшей вершины со значением е) написать программу которая находит число ветвей от корня до ближайшей вершины со значением е. Если такой вершины нет то ответ должен быть -1. http://www.cyberforum.ru/cpp-beginners/thread862976.html
Задача на графику, анимация масштабирования C++
Помогите пожалуйста написать программу. Компилятор Dev C++. Консоль. Написать программу увеличения и уменьшения снежинки по достижению некоторого максимального или минимального размеров соответственно. Грубо говоря, есть снежинка (можно просто звездочку *), сделать масштабирование нажатиями клавиш "стрелочка вверх" и "стрелочка вниз" до определенного значения.
Написать коментарии C++
#include <iostream> class S { public: virtual int get() = 0;}; class A1 : public S { public: virtual int get() {
C++ Ошибка компиляции в VS2010 http://www.cyberforum.ru/cpp-beginners/thread862959.html
Написал код на Dev C++. Пихаю в визуалку и она отказываеться компилировать( Ругаеться на 116 строчку, пишет что ф-ция должна вернуть значение. но если я буду чтото возвращать или сделаю ее воид то програма будет работать не коректно. Подскажите в чем загвоздка. #include <iostream> #include <string> #include <conio.h> using namespace std; enum CATEGORY{family, sport, cabrio, jeep}; ...
C++ Fit набора точек Привет! Кто-нибудь может посоветовать уже какой-нибудь готовый код, который делает фит набора точек произвольной функцией с определенным кол-вом свободных параметров? Заранее спасибо! подробнее

Показать сообщение отдельно
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
13.05.2013, 14:40     Как создать двоичное дерево, элементы которого заполняются по слоям слева направо?
Что-то вроде простая задача, а далась тяжело. Благодаря коллективным усилиям:
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <iostream>
#include <set>
#include <cmath>
 
struct BNode
{
    int key;
    BNode* left;
    BNode* right;
    BNode* parent;
};
 
BNode* global_root = 0;
bool state = false;
std::set<int> table;
 
static double curr_node = 0;
static double curr_line = 1;
 
unsigned get_line()
{
    ++curr_node;
    if ((pow(curr_node, 1/(curr_line))) == 2.0)
    {
        ++curr_line;
    }
    return curr_line;
}
 
void put_node(BNode* root, int key, int depth)
{
    
    if (!state)
    {
        state = true;
        get_line();
    }
 
    if (curr_line == 1)
    {
        global_root = new BNode;
        global_root->left = global_root->right = 0;
        global_root->parent = global_root;
        global_root->key = key;
        return;
    }
 
    if (depth >= curr_line)
    {
        return;
    }
 
    if (!root->left)
    {
        std::set<int>::iterator i = table.find(key);
        if (i == table.end())
        {
            root->left = new BNode;
            root->left->left = root->left->right = 0;
            root->left->parent = root;
            root->left->key = key;
            table.insert(key);
            return;
        }
    }
 
    if (!root->right)
    {
        std::set<int>::iterator i = table.find(key);
        if (i == table.end() && depth < curr_line)
        {
            root->right = new BNode;
            root->right->left = root->right->right = 0;
            root->right->parent = root;
            root->right->key = key;
            table.insert(key);
            return;
        }
    }
 
    if (root->left)
    {
        put_node(root->left, key, depth+1);
    }
 
    if (root->right)
    {
        put_node(root->right, key, depth+1);
    }
}
 
void show_tree(BNode* root, int lvl)
{
    if (!root)
    {
        return;
    }
    std::cout << "lvl: " << lvl << "; key: " << root->key << std::endl;
    show_tree(root->left, lvl + 1);
    show_tree(root->right, lvl + 1);
}
 
int main()
{
    put_node(global_root, 4, 1); state = false;
    show_tree(global_root, 1); std::cout << std::endl;
    put_node(global_root, 2, 1); state = false;
    show_tree(global_root, 1); std::cout << std::endl;
    put_node(global_root, 6, 1); state = false;
    show_tree(global_root, 1); std::cout << std::endl;
    put_node(global_root, 1, 1); state = false;
    show_tree(global_root, 1); std::cout << std::endl;
    put_node(global_root, 3, 1); state = false;
    show_tree(global_root, 1); std::cout << std::endl;
    put_node(global_root, 5, 1); state = false;
    show_tree(global_root, 1); std::cout << std::endl;
    put_node(global_root, 7, 1); state = false;
 
    show_tree(global_root, 1);
}
Добавлено через 1 минуту
ПС. Освобождение памяти под элементы предоставляется ОС.

Добавлено через 1 минуту
Ternsip, просто изначально делал без *parent, но если вы настаиваете...
 
Текущее время: 12:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru