3 / 2 / 0
Регистрация: 04.06.2019
Сообщений: 52
1

Если в дереве есть хотя бы один простой элемент, то найти сумму не листьев; иначе увеличить все четные элементы вдвое

08.06.2019, 01:43. Показов 1318. Ответов 3
Метки нет (Все метки)

Дано дерево целых чисел. Если в дереве хотя бы один простой элемент, то найти сумму не листьев. Иначе увеличить все четные элементы вдвое.
Что неправильно в решении?
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
#include "pch.h"
#include <iostream>
using namespace std;
bool prost(int n)
{
    for (int i = 2; i < n; i++)
        if (n%i == 0)
            return false;
    return true;
}
struct tree
{
    int info;
    tree*l;
    tree*r;
};
void add(tree *t, int x)
{
    tree*q;
    if (x < t->info)
        if (t->l == NULL)
        {
            q = new(tree); q->info = x;
            q->l = NULL; q->r == NULL; t->l = q;
        }
        else add(t->l, x);
    else
        if (t->r == NULL)
        {
            q = new(tree); q->info = x;
            q->l = NULL; q->r == NULL; t->r = q;
        }
        else add(t->r, x);
}
 
bool f = 0;
int s = 0;
void oneSimple(tree*p)
{
    if (p != NULL)
        if (prost(p->info))
        {
            f = 1;
        }
    oneSimple(p->l);
    oneSimple(p->r);
}
void kek(tree*p)
{
    if (f)
    {
        if (p != NULL)
            if (p->l != NULL || p->r != NULL)
            {
                s += p->info;
                kek(p->l);
                kek(p->r);
            }
    }
    else {
        if (p != NULL)
            if (p->info % 2 == 0) p->info *= 2;
        kek(p->l);
        kek(p->r);
    }
}
void print(tree*p)
{
    if (p != NULL)
    {
        cout << p->info << " ";
        print(p->l);
        print(p->r);
    }
}
int main()
{
    int x;
    tree*beg = new(tree);
    cout << "input elem" << endl;
    cin >> x;
    beg->info = x;
    beg->l = NULL;
    beg->r = NULL;
    while (x != 0)
    {
        cin >> x;
        if (x != 0) add(beg, x);
    }
    kek(beg);
    print(beg);
    cout << "sum" << s << endl;
    system("pause");
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2019, 01:43
Ответы с готовыми решениями:

Если сумма цифр введенного трехзначного числа N четная, то увеличить число вдвое, иначе найти сумму N+1N
Если сумма цифр введенного трехзначного числа N четная, то увеличить число вдвое, иначе найти сумму...

Если в строках или столбцах есть хотя бы один элемент равный нулю, заменить нулями все их элементы
Помогите решить задачу. Обнуление матрицы. Дана матрица NxN. Элементы, стоящие в строках или...

если сумму цифр введенного трехзначного числа N кратна трем, то увеличить число на единицу, иначе-уменьшить вдвое
если сумму цифр введенного трехзначного числа N кратна трем, то увеличить число на единицу,...

Если все введенные числа положительны, то вывести их произведение,если среди них есть хотя бы один 0, то сумму
Помогите пожалуйста написать программу Если все введенные числа положительны, то вывести их...

3
439 / 282 / 183
Регистрация: 23.06.2018
Сообщений: 650
08.06.2019, 03:16 2
Важное:
1. Внутри void add в при добавлении вы сравниваете, а не присваиваете: q->r == NULL;
2. Бесконечная рекурсия в void oneSimple, потому что если указатель нулевой, то надо пропускать всю функцию, а не только проверку числа.
2.1. Отсутствие вызова void oneSimple. Предположительно после окончания ввода.
3. Бесконечная ресурсия в void kek, в случае когда f == 0. И снова потому, что если указатель нулевой, то надо пропускать всё, а не только удваивание.

Не очень важное:
4. Нет пробела после слова sum.
0
3 / 2 / 0
Регистрация: 04.06.2019
Сообщений: 52
08.06.2019, 03:58  [ТС] 3
На счёт третьего пункта, задумка в том что f возвращает 1 если находит хоть один простой(функция oneSimple), а если не находи, то есть f остаётся 0, то удваивает четные элементы. Или вы имеете ввиду, что надо поставить p!=NULL выше if(f)?
0
439 / 282 / 183
Регистрация: 23.06.2018
Сообщений: 650
08.06.2019, 04:23 4
Лучший ответ Сообщение было отмечено n2kkrd как решение

Решение

Вообще то, что либо в самом начале функции стоит ставить
C++
1
2
if (p == NULL)
    return;
либо заключать в if все действия
C++
1
2
3
4
5
6
7
8
9
//...
else {
    if (p != NULL)
    {
        if (p->info % 2 == 0) p->info *= 2;
        kek(p->l);
        kek(p->r);
    }
}
Добавлено через 5 минут
P.S. Кстати я сглупил и забыл, что там будет не бесконечная рекурсия, а просто ошибка за обращение к nullptr.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2019, 04:23
Помогаю со студенческими работами здесь

Если в массиве есть хотя бы один элемент, равный x, то получить сумму элементов
Дано натуральное число n, целое x и массив целых чисел a . Если в массиве есть хотя бы один...

Заменить все элементы главной диагонали квадратной матрицы нулями, если на главной диагонали есть хотя бы один отрицательный элемент
Заменить все элементы главной диагонали квадратной матрицы (4*4) нулями, если на главной диагонали...

Если в массиве кол-во элементов меньше 3, то все элементы увеличить вдвое
Тема:Одномерные числовые массивы. 1.Если в массиве кол-во элементов меньше 3 , то все элементы...

Если в матрице есть хотя бы один элемент, больший ста, то элементы обеих диагоналей заменить нулями
Если в заданной матрице A(N,M) есть хотя бы один элемент, больший ста, то элементы обеих диагоналей...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru