Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 1 / 0
Регистрация: 01.11.2020
Сообщений: 616

Как сделать чтобы выводило такое дерево

16.04.2021, 21:11. Показов 1750. Ответов 8

Студворк — интернет-сервис помощи студентам
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
#include <iostream>
using namespace std;
struct tree {
    int ticket_code;
    int numberofthings;
    string last_name;
    tree* left, * right;
};
#define COUNT 10
 
 
void create_tree(tree** p, int n)
{
    if (n == 0)
    {
        *p = NULL;
    }
    else
    {
 
        tree* newP = new tree;
        cout << "VVedi ticket_code: ";
        cin >> newP->ticket_code;
        cout << "VVedi numberofthings: ";
        cin >> newP->numberofthings;
        cout << "VVedi lastname: ";
        cin >> newP->last_name;
        int
            nl = n / 2,
            nr = n - nl - 1;
        create_tree(&newP->left, nl);
        create_tree(&newP->right, nr);
        *p = newP;
    }
}
void print2DUtil(tree* root, int space)
{
    if (root == NULL)
        return;
 
    space += COUNT;
 
 
    print2DUtil(root->right, space);
 
 
    cout << endl;
    for (int i = COUNT; i < space; i++)
        cout << " ";
    cout << root->ticket_code << "\t";
    cout << root->numberofthings << "\t";
    cout << root->ticket_code << "\t";
 
    print2DUtil(root->left, space);
}
 
void print2D(tree* root)
{
    print2DUtil(root, 0);
}
int getSum(tree* root, int& elements, int& sum)
{
    ++elements;
    sum += root->ticket_code;
    if (root->left != NULL)
        getSum(root->left, elements,sum);
    if (root->right != NULL)
        getSum(root->right, elements,sum);
    return sum;
}
int getAverage(tree* root)
{
    int sum = 0;
    int elements = 0;
    getSum(root, elements,sum);
    return sum / elements;
}
 
int main()
{
    int n;
    tree* root;
    cout << "VVedi razmer: ";
    cin >> n;
    create_tree(&root, n);
    print2D(root);
    int average = getAverage(root);
    cout << endl;
    cout << average<<endl;
    return 0;
}
Миниатюры
Как сделать чтобы выводило такое дерево  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.04.2021, 21:11
Ответы с готовыми решениями:

как сделать чтобы поэтапно выводило массив?
#include&lt;iostream&gt; using namespace std; void quickSort(int a, long N) { if (N &lt; 2) return; long i = 0, j = N -...

Как сделать чтобы ответ выводило таблицей по 10 чисел?
Как сделать чтобы ответ выводило таблицей по 10 чисел? Ниже написан код программы #include &lt;iostream&gt; #include &lt;conio.h&gt;...

Как можно сделать чтобы при вводе букв выводило ошибку?
Как можно сделать в массиве console c++ чтобы при вводе букв выводило ошибку или просто ничего не происходило ? #define SWAP(a,b) {int...

8
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
16.04.2021, 21:54
А какие тут входные данные?
0
0 / 1 / 0
Регистрация: 01.11.2020
Сообщений: 616
16.04.2021, 22:58  [ТС]
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
#include <iostream>
using namespace std;
struct tree {
    int ticket_code;
    int numberofthings;
    string last_name;
    tree* left, * right;
};
#define COUNT 10
 
 
void create_tree(tree** p, int n)
{
    if (n == 0)
    {
        *p = NULL;
    }
    else
    {
 
        tree* newP = new tree;
        cout << "VVedi ticket_code: ";
        cin >> newP->ticket_code;
        cout << "VVedi numberofthings: ";
        cin >> newP->numberofthings;
        cout << "VVedi lastname: ";
        cin >> newP->last_name;
        int
            nl = n / 2,
            nr = n - nl - 1;
        create_tree(&newP->left, nl);
        create_tree(&newP->right, nr);
        *p = newP;
    }
}
void print2DUtil(tree* root, int space)
{
    if (root == NULL)
        return;
 
    std::string indent(space, ' ');
    cout << indent << root->ticket_code << "\n";
    cout << indent << root->numberofthings << "\n";
    cout << indent << root->last_name << "\n";
 
    print2DUtil(root->right, space + COUNT);
    print2DUtil(root->left, space + COUNT);
}
void print2D(tree* root)
{
    print2DUtil(root, 0);
}
int getSum(tree* root, int& elements, int& sum)
{
    ++elements;
    sum += root->ticket_code;
    if (root->left != NULL)
        getSum(root->left, elements,sum);
    if (root->right != NULL)
        getSum(root->right, elements,sum);
    return sum;
}
int getAverage(tree* root)
{
    int sum = 0;
    int elements = 0;
    getSum(root, elements,sum);
    return sum / elements;
}
 
void deleteBinaryTree(tree*& root)
{
    if (root == nullptr) {
        return;
    }
 
    deleteBinaryTree(root->left);
    deleteBinaryTree(root->right);
 
    delete root;
 
    root = nullptr;
}
 
int main()
{
    int n;
    tree* root;
    cout << "VVedi razmer: ";
    cin >> n;
    create_tree(&root, n);
    print2D(root);
    float average = getAverage(root);
    cout << endl;
    cout << average<<endl;
    /*deleteBinaryTree(root);
    if (root == nullptr) {
        cout << "Tree Successfully Deleted";
    }*/
    return 0;
}
Добавлено через 36 минут
Мне нужно чтобы оно выводило как дерево чтобы одна введена структура была как одна ветвь
0
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
16.04.2021, 23:50
Лучший ответ Сообщение было отмечено Andriyipz как решение

Решение

Цитата Сообщение от Andriyipz Посмотреть сообщение
Мне нужно чтобы оно выводило как дерево чтобы одна введена структура была как одна ветвь
Это понятно, но приятнее иметь готовые входные данные, чтобы быстро их вставлять в консоль.

Эта функция работает только пока у вас глубина дерева не выше 32 (ну можно ещё int64_t вставить, но мне кажется у вас стек раньше закончится). В принципе в вашем коде этого достаточно, так как вы равномерно распределяете элементы и вряд ли будете вводить больше 4 миллиардов объектов.
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
void print2DUtil(tree* root, uint32_t links = 0, int bits = 0)
{
    if (root == NULL)
        return;
 
    print2DUtil(root->right, links, bits + 1);
 
 
    uint32_t flag = links ^ links << 1;
    for (int i = 1; i < bits; i++)
    {
        if (flag & 1 << i)
            cout << "  |";
        else
            cout << "   ";
    }
    if (bits == 0)
        cout << "--";
    else if (links & 1 << bits - 1)
        cout << "   `--";
    else
        cout << "   .--";
 
 
    cout << root->ticket_code << "\t";
    cout << root->numberofthings << "\t";
    cout << root->ticket_code << "\t";
    cout << endl;
 
 
    print2DUtil(root->left, links | (1 << bits), bits + 1);
}
0
0 / 1 / 0
Регистрация: 01.11.2020
Сообщений: 616
17.04.2021, 08:36  [ТС]
чего вот так получается
Миниатюры
Как сделать чтобы выводило такое дерево  
0
0 / 1 / 0
Регистрация: 01.11.2020
Сообщений: 616
17.04.2021, 09:10  [ТС]
выводит то не так
Миниатюры
Как сделать чтобы выводило такое дерево  
0
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
17.04.2021, 20:46
Ага, и что в вашем понимании "так"?
0
0 / 1 / 0
Регистрация: 01.11.2020
Сообщений: 616
18.04.2021, 22:05  [ТС]
спасибо, но можете объяснить как оно работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uint32_t flag = links ^ links << 1;
    for (int i = 1; i < bits; i++)
    {
        if (flag & 1 << i)
            cout << "  |";
        else
            cout << "   ";
    }
    if (bits == 0)
        cout << "--";
    else if (links & 1 << bits - 1)
        cout << "   `--";
    else
        cout << "   .--";
0
458 / 294 / 191
Регистрация: 23.06.2018
Сообщений: 678
20.04.2021, 04:42
Как бы вам сказать... Я плохо объясняю, поэтому проще будет, если вы скажите что именно вам непонятно.

bits - глубина обрабатываемого узла (у корня bits == 0), а links - путь от корня до текущего узла.
Путь хранится побитово: 0-й бит хранит выбранное поддерево корня, 1-й бит - выбранное поддерево выбранного поддерева корня и т.д.
Значения: 0 - правое поддерево, 1 - левое поддерево.

Сначала горизонтальные линии
Цитата Сообщение от Andriyipz Посмотреть сообщение
if (bits == 0)
cout << "--";
else if (links & 1 << bits - 1)
cout << " `--";
else
cout << " .--";
Горизонтальные линии зависят от того, какой узел сейчас обрабатывается. 3 возможных варианта (в соответствии с кодом):
1. Корень. Определяется тем, что перед ним не было узлов (bits == 0).
2. Левый узел. Определяется по bits-1-му биту. Если явно указывать порядок операций, то это выглядит как (links & (1 << (bits - 1))) != 0.
3. Правый узел. Если обрабатывается не корень и не левый узел, то остаётся лишь этот вариант.

Касательно вертикальных линий
Цитата Сообщение от Andriyipz Посмотреть сообщение
uint32_t flag = links ^ links << 1;
for (int i = 1; i < bits; i++)
{
if (flag & 1 << i)
cout << " |";
else
cout << " ";
}
Вертикальная линия видна только тогда, когда была смена направления (сначала выбран правый узел, потом левый, или наоборот). Это результат исключащего или между i-м битом и i-1-м битом. Поэтому я просто делаю побитовый XOR между простым links и links сдвинутым на 1 бит, после чего побитово проверяю результат. Если проверяемый бит равен 1 - была смена направления и вертикальная линия видна, иначе бит равен 0.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.04.2021, 04:42
Помогаю со студенческими работами здесь

Как сделать чтобы потом выводило матрицу с максимумом и минимумом, которые я нашел, поменяными местами?
// #include &lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;cstdlib&gt; using namespace std; int main() { const size_t...

как сделать чтобы читало русские буквы с массива и выводило русский шрифт при функции рекурсии
Добрый день #include &lt;iostream&gt; using namespace std; void reverse(char *s); int main()

как сделать чтобы сгенерированный массив передался на другие функции и каждый раз сортировали этот массив и выводило их
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; #include&quot;Header.h&quot; #include&lt;Windows.h&gt; #define N 80 using namespace...

Необходимо немного исправить код(сделать так чтобы не выводило лишние 0), и выводило поле слева от номера бита
#include &lt;stdio.h&gt; unsigned setbit(unsigned x, int p, int n); void printfbit(unsigned n); int main() { ...

Как сделать чтобы выводило все числа?
Паскаль выдаёт такой ответ: 1.03590220394703E+25 А мне нужен такой: 10359022039470231387111424 Как сделать чтобы выводило все числа?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru