Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2023, 23:57   #1
Nbm
Новичок
Джуниор
 
Регистрация: 06.10.2023
Сообщений: 3
По умолчанию С++ Для каждой вершины дерева с четным значением уменьшить ее значение в два раза

По своему условию я написала программу: Дан указатель P1 на корень непустого дерева. Для каждой вершины дерева с четным значением уменьшить ее значение в два раза.
Мне нужно, чтобы элементы печатались в том порядке в котором вводятся, а они сортируются по возрастанию. Как убрать сортировку элементов дерева при печати перед изменением дерева и после изменения дерева
Может я не правильно написала программу, согласно условию, кто-нибудь может сказать как нужно?

Код:

#include <iostream>

using namespace std;

// Структура узла дерева
struct node
{
    int count;       // Счетчик (данные узла)
    node* left;     // Указатель на левый дочерний узел
    node* right;    // Указатель на правый дочерний узел
};

// Функция для создания нового узла дерева
node* createNode(int count)
{
    node* newNode = new node();     // Выделение памяти для нового узла

    if (!newNode)                  // Если выделение памяти не удалось
    {
        cout << "Ошибка памяти\n";     // Вывести сообщение об ошибке
        return nullptr;
    }

    // Наполнение узела данными и устанавление его потомков как пустые
    newNode->count = count;           // Присвоить данные новому узлу
    newNode->left = newNode->right = nullptr;   // Установить указатели на дочерние узлы в nullptr
    return newNode;                 // Вернуть адрес нового узла
}

// Функция для вставки узла в дерево
node* insertNode(node* root, int count)
{
    // Если дерево пустое, создаем новый узел и делаем его корнем дерева
    if (root == nullptr)
    {
        root = createNode(count);
        return root;
    }

    // Если вводимое значение меньше текущего узла, то вставляем его в левое поддерево, иначе, вставляем его в правое поддерево
    if (count < root->count)
    {
        root->left = insertNode(root->left, count);
    }
    else if (count > root->count)
    {
        root->right = insertNode(root->right, count);
    }

    // Возвращает корневой узел дерева
    return root;
}

// Функция для модификации дерева (делит данные каждого четного узла пополам)
node* modifyTree(node* root)
{
    if (root == nullptr)
    {
        return nullptr;
    }

    // Применяется модификация к каждой ветке дерева
    root->left = modifyTree(root->left);
    root->right = modifyTree(root->right);

    // Если данные узла - четное число, то делит его пополам
    if (root->count % 2 == 0)
    {
        root->count /= 2;
    }

    return root;
}

// Функция для обхода дерева в симметричном порядке (левый узел - корень - правый узел)
void symmetricalTraversal(node* root)
{
    if (root == nullptr)
    {
        return;
    }

    symmetricalTraversal(root->left);
    cout << root->count << " ";
    symmetricalTraversal(root->right);
}

// Функция для очистки дерева
void deleteTree(node* root)
{
    if (root == nullptr)
        return;

    deleteTree(root->left);
    deleteTree(root->right);

    delete root;
}

int main()
{
    setlocale(LC_ALL, "Russian");

    node* root = nullptr;   // Создаем пустое дерево
    int nodeCount, count;

    cout << "Сколько узлов вы хотите вставить?: ";
    cin >> nodeCount;

    // Читаем значения и добавляем их в дерево
    for (int i = 0; i < nodeCount; i++) 
    {
        cout << "Введите значение для узла " << (i + 1) << ": ";
        cin >> count;

        // Если это первое значение, создаем корневой узел
        if (i == 0)
        {
            root = insertNode(root, count);
        }
        else   // Для остальных значений выполняем вставку
        {
            insertNode(root, count);
        }
    }

    cout << "Перед изменением дерево:\n";
    symmetricalTraversal(root);

    cout << "\n\nПосле изменения дерево:\n";
    root = modifyTree(root);
    symmetricalTraversal(root);

    // Очищаем дерево
    deleteTree(root);

    return 0;
}
Nbm вне форума Ответить с цитированием
Старый 07.10.2023, 01:55   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Ваша функция insertNode "строит" не просто двоичное дерево, а двоичное дерево поиска. Симметричный обход такого дерева дает элементы по возрастанию. Нужно по-другому заполнять дерево, чтобы симметричный обход выдал элементы в порядке, совпадающем с порядком ввода. Но в условии никаких требований о порядке нет, дерево уже дано, и, кстати, не сказано, что дерево именно двоичное.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 07.10.2023, 06:49   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Это не ваша программа и думать вы не хотите. Я никогда не поверю, что человек хоть чуть подумавший вдруг не нашел, где у него элементы сравниваются.
p51x вне форума Ответить с цитированием
Старый 07.10.2023, 09:21   #4
Nbm
Новичок
Джуниор
 
Регистрация: 06.10.2023
Сообщений: 3
По умолчанию

Я это понимаю, но не знаю как исправить, потому, что эту функцию я взяла из учебника, который нам дали, другого там нет. Поэтому и спрашиваю.
Nbm вне форума Ответить с цитированием
Старый 07.10.2023, 09:56   #5
Nbm
Новичок
Джуниор
 
Регистрация: 06.10.2023
Сообщений: 3
По умолчанию

Какой обход применить лучше симметричный или сили другой в этой задаче
Nbm вне форума Ответить с цитированием
Старый 08.10.2023, 07:00   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вы можете в insertNode не сравнивать элементы, а всегда добавлять очередной элемент в правое поддерево, тогда при симметричном обходе порядок ввода и вывода совпадёт.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уменьшить картинку - Есть изображение каких-то там размеров. Нужно уменьшить его вдвое по всем параметрам. процедура уменьшает размер картинки (jpg) в два раза Kronos913 Общие вопросы Delphi 2 19.03.2021 10:15
[Pascal ABC] Если максимальное значение из трёх введённых чисел больше 50, то найти произведение чисел, иначе - уменьшить каждое число в 2 раза. Supard Помощь студентам 4 29.09.2017 10:20
Удаление заданной вершины бинарного дерева. bobbyserf Общие вопросы C/C++ 0 19.04.2015 21:34
Дан массив X(N,M) .Уменьшить в 2 раза все элементы той строки массива,в которой находится наибольший элемент. darwin1 Паскаль, Turbo Pascal, PascalABC.NET 1 13.04.2014 11:54
улаление вершины дерева olol-o Помощь студентам 3 27.12.2012 17:05