Зигзагообразный обход, С++, ошибка выполнения: сигнал прерывания от прерывания (3) (SIGABRT), неправильное выделение памяти

Зигзагообразный обход, С++, ошибка выполнения: сигнал прерывания от прерывания (3) (SIGABRT), неправильное выделение памяти

class Solution {
public:
    void solve(Node* root, vector<int>& v, int i)
    {
        if (root == NULL) {
            return;
        }
        stack<Node*> ms;
        stack<Node*> cs;
        ms.push(root);

        while (ms.empty() == false) {
            Node* curr = ms.top();
            ms.pop();
            v.push_back(curr->data);
            if (i % 2 != 0) {
                if (curr->left != NULL) {
                    cs.push(root->left);
                }
                if (curr->right != NULL) {
                    cs.push(root->right);
                }
            }
            if (i % 2 == 0) {
                if (curr->right != NULL) {
                    cs.push(root->right);
                }
                if (curr->left != NULL) {
                    cs.push(root->left);
                }
            }

            if (ms.empty()) {
                cs.swap(ms);

                ++i;
            }
        }
    }

    //Function to store the zig zag order traversal of tree in a list.
    vector<int> zigZagTraversal(Node* root)
    {
        // Code here
        vector<int> v;
        int i = 1;
        solve(root, v, i);
        return v;
    }
};

Код выдает ошибку времени выполнения как, Ошибка выполнения: сигнал прерывания от прерывания (3) (SIGABRT). Я не могу найти ошибку, пожалуйста, помогите мне.

Что должен делать этот код? Пожалуйста, предоставьте более подробную информацию. Кроме того, вы вообще пытались отлаживать?

kiner_shah 16.02.2023 09:22

Создайте правильный минимальный воспроизводимый пример с жестко запрограммированным в программе ошибочным «вводом». Затем соберите и отладьте локально в своей системе.

Some programmer dude 16.02.2023 09:25

@kiner_shah Код не выполняется в VS Code, он отображается как неправильное выделение памяти. Предполагается, что код проходит бинарное дерево по зигзагообразному шаблону.

user21141068 16.02.2023 09:29

Способ найти ошибку состоит в том, чтобы скомпилировать код, исправить ошибки компилятора, затем написать тесты, сделать все тесты пройденными, а затем использовать отладчик. шаг 1 уже не работает godbolt.org/z/jTWbPxMYW

463035818_is_not_a_number 16.02.2023 09:33

Я не могу найти ошибку. Вы написали код, у вас есть тестовый пример, поэтому нет оправдания тому, что вы не можете найти ошибку (посредством отладки), чтобы увидеть, где в вашем коде она идет вразрез с вашими ожиданиями. . Как исправить ошибку — это отдельная история, но, по крайней мере, вы должны выяснить, где ваш код не делает того, что вы ожидаете. Помните, вы написали код.

PaulMcKenzie 16.02.2023 09:35
v.push_back(curr->data); -- Что, если curr это nullptr? Вы разыменовываете нулевой указатель, что приводит к неопределенному поведению.
PaulMcKenzie 16.02.2023 09:40

@PaulMcKenzie Для небольших входных данных он работает, но для больших входных данных он даже не компилируется, что показывает плохое распределение памяти.

user21141068 16.02.2023 09:42

@PaulMcKenzie Я не думаю, что на данный момент curr может быть нулевым.

Michaël Roy 16.02.2023 09:43

@user21141068 user21141068, но для больших входных данных он даже не компилируется, -- Что вы подразумеваете под «даже не компилируется»? Если программа запускается, она уже "скомпилирована". Просто в вашей программе есть ошибка, которую вы не обнаружили, и, вероятно, не имеет значения, насколько велик входной сигнал. Вы просто не нашли тестовый пример, где он терпит неудачу.

PaulMcKenzie 16.02.2023 09:44

@ user21141068 Ошибка может быть в другой части кода. Как, например, когда вы вставляете узлы в дерево. Это очень распространенная точка ошибок для деревьев.

Michaël Roy 16.02.2023 09:45

@PaulMcKenzie curr будет nullptr только в случае ms.empty() == true , в этом случае цикл прерывается.

user21141068 16.02.2023 09:47

@ user21141068 -- Пожалуйста, опубликуйте минимально воспроизводимый пример . Во-первых, неясно, что должен обозначать «зигзаг». Во-вторых, у нас нет main программы с тестовыми данными. Вам дали эту ссылку. Это состояние кода, который вы нам дали — видите ошибки? Перейдите по этой ссылке, исправьте ошибки, добавьте main и опубликуйте код здесь.

PaulMcKenzie 16.02.2023 09:48

Curr будет nullptr только в случае ms.empty() == true , в этом случае цикл прерывается. -- Я не вижу подтверждения этого в коде, который вы разместили. Вы предполагали это, но проверили ли вы это? Возможно, возможно: if (!curr) { cout << "I messed up"; } сразу после получения топового предмета? Все, что я вижу, это доступ к curr, как если бы он был действительным, и я понятия не имею, что это может быть. Учитывая ошибку времени выполнения и тот небольшой код, который вы разместили, это один из логических выводов о том, почему программа рухнет.

PaulMcKenzie 16.02.2023 09:55
Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
1
13
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В следующий раз, когда вы опубликуете, пожалуйста, сделайте то, что предложили другие:

  • объяснить, что должен делать код;
  • создать MVP;
  • попробуйте отладить локально;

Ваша проблема заключается в следующем:

У вас бесконечный цикл, потому что вы всегда добавляете потомков корня, а не потомков текущего узла.

Ваше решение таково:

Cs.push(root->left); должен быть cs.push(curr->left); во всех четырех местах. (Замените левый на правый, где это уместно.)

Чтобы избежать в следующий раз:

Используйте полные слова в качестве имен переменных, например current, вместо curr. Тогда у вас будет меньше шансов перепутать его с чем-то похожим, например root.

Именование — одна из самых сложных проблем, и она приводит ко многим ошибкам, подобным той, что была у вас.

Спасибо, я здесь новенький, в следующий раз буду понятен.

user21141068 16.02.2023 10:18

Конечно, я забыл сказать, добро пожаловать в Stack Overflow :)

stanm 16.02.2023 13:24

Другие вопросы по теме

Похожие вопросы

Код VS Неопределенные символы для архитектуры arm64
Как правильно использовать ключевое слово delete, чтобы избежать утечек памяти в С++
Где лучше хранить random_device/mt19937?
Есть ли существенная разница между использованием встроенного генератора случайных чисел и использованием криптографического генератора случайных чисел?
Вставить по порядку ряд битов в байт (u_int8_t)
С++: нужен ли виртуальный деструктор для объектов, выделенных в стеке?
Имеет ли GCC11 регрессию, в которой он неправильно принимает указатель на массив абстрактного класса
Явное создание объектов с помощью тривиального конструктора по умолчанию с использованием нового размещения в C++17.
Каков наиболее ресурсоэффективный способ проверить, содержат ли два списка std::list одинаковые уникальные элементы?
С++: получение случайных символов в качестве вывода, не знаю, почему