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

Бинарное дерево: посчитать количество листьев

09.01.2019, 16:05. Показов 9706. Ответов 2

Студворк — интернет-сервис помощи студентам
Нужно построить бинарное дерево типа *char. В этом бинарном дереве найти количество листьев (листья, как я понимаю, это элементы, которые не содержат потомков). Попробовал написать, но выводится какая-то каша-малаша. Не совсем понимаю принцип работы этого дерева. Был бы очень благодарен за помощь
С односвязными и двусвязными списками было как-то проще.

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
#include <iostream>
#include <ctime>
 
using namespace std;
 
struct point
{
    char *key;//информационное поле
    point *left;//адрес левого поддерева
    point *right;//адрес правого поддерева
};
 
//добавление элемента d в дерево поиска Корень Левое поддерево Правое поддерево
//построение идеально сбалансированного дерева
point* Tree(int n, point* beg)
{
    point*r;
    int nl, nr;
    if (n == 0) { beg = NULL; return beg; }
    nl = n / 2;
    nr = n - nl - 1;
    r = new point;
    char s[50];
    cout << "Слово: ";
    cin >> s;
    r->key = new char[strlen(s) + 1];
    r->left = Tree(nl, r->left);
    r->right = Tree(nr, r->right);
    beg = r;
    return beg;
}
 
void treeprint(point *beg) {
    if (beg != NULL) {
        treeprint(beg->left);
        cout << beg->key << endl;
        treeprint(beg->right);
    }
}
 
int main()
{
    setlocale(LC_ALL, "russian");
    srand(time(NULL));
    int n = 0, k = 0;
    point *beg = nullptr;
    do
    {
        cout << "1. Создать бинарное дерево\n";
        cout << "2. Показать бинарное дерево\n";
        cout << "3. Выход\n";
        cin >> k;
        switch (k)
        {
        case 1:
            cout << "Введите количество элементов" << endl;
            cin >> n;
            beg = Tree(n, beg);
            cout << endl;
            break;
        case 2:
            treeprint(beg);
            cout << endl;
            break;
        }
    } while (k != 3);
    system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.01.2019, 16:05
Ответы с готовыми решениями:

Сформировать бинарное дерево, посчитать количество листьев
помогите написать программу,можно и с использованием классов. сформировать бинарное дерево элементами которого являются целые...

Бинарное дерево: найти количество листьев
Нужно написать функцию, которая находит количество листьев в бинарном дереве

Построить и вывести бинарное дерево, степень всех вершин которого, кроме листьев, равна введенному числу
Здравствуйте! Нужно построить и вывести бинарное дерево, степень всех вершин которого, кроме листьев, равна введенному натуральному числу...

2
447 / 333 / 172
Регистрация: 01.07.2015
Сообщений: 1,161
09.01.2019, 16:53
Цитата Сообщение от Edudin97 Посмотреть сообщение
В этом бинарном дереве найти количество листьев (листья, как я понимаю, это элементы, которые не содержат потомков)
При обходе (treeprint) проверяйте, содержит ли узел потомков, если обоих нет, то это лист и выводите его
1
2 / 2 / 1
Регистрация: 18.04.2017
Сообщений: 48
10.01.2019, 15:18  [ТС]
Спасибо за совет. Вроде бы сделал, но считает странно.
Если введу 3 символа, то да, скажет что 2 листа. А если вот ввожу 5 символов, то говорит что 5 листов, что под сомнением... Все выполняется в функции treepprint
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
#include <iostream>
#include <ctime>
#include <cstring>
 
using namespace std;
 
struct point
{
    char *data;//информационное поле
    point *left;//адрес левого поддерева
    point *right;//адрес правого поддерева
};
 
point* tree(int n, point* p)
{
    point *r;
    int nl, nr;
    if (n == 0) { p = NULL; return p; }
    nl = n / 2;
    nr = n - nl - 1;
    r = new point;
    char s[50];
    cout << "Значение: ";
    cin >> s;
    r->data = new char[strlen(s) + 1];
    strcpy(r->data, s);
    r->left = tree(nl, r->left);
    r->right = tree(nr, r->right);
    p = r;
    return p;
}
 
void treeprint(point *p, int &count) {
    if (p != NULL) {
        treeprint(p->left, count);
        cout << p->data << "  ";
        treeprint(p->right, count);
        if ((p->left == NULL) && (p->right == NULL))
            count = count + 1;
    }
}
 
int main()
{
    setlocale(LC_ALL, "russian");
    srand(time(NULL));
    int n = 0, k = 0, count = 0;
    point *beg = nullptr;
    do
    {
        cout << "1. Посторить бинарное дерево\n";
        cout << "2. Показать бинарное дерево\n";
        cout << "3. Выход\n";
        cin >> k;
        switch (k)
        {
        case 1:
            cout << "Введите количество элементов" << endl;
            cin >> n;
            beg = tree(n, beg);
            cout << endl;
            break;
        case 2:
            treeprint(beg, count);
            cout << endl;
            cout << "Листьев в дереве: " << count << endl;
            break;
        }
    } while (k != 3);
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2019, 15:18
Помогаю со студенческими работами здесь

Бинарное дерево поиска. Сумма "листьев"
Доброго времени суток. Суть задачи состоит в том, чтобы посчитать сумму элементов, находящих на &quot;листочках&quot; дерева. Никак...

Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру
Помогите, не могу понять!( Нужно исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру. вот...

Бинарное дерево поиска (Количество элементов)
Здравствуйте все. Помогите пожалуйста разобраться с 2 ошибками. 1) Иногда добавляются числа не в правильном порядке. (в смысле напишу...

Бинарное дерево: вывести номера вершин у которых количество потомков в левом и правом поддеревьях различается
Всем доброго времени суток! Необходима помощь , или даже советы в реализации задачи. Нужно создать бинарное дерево , ввод чисел в...

Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой
Дано бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой.


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru