Зигзагообразный обход, С++, ошибка выполнения: сигнал прерывания от прерывания (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 Код не выполняется в VS Code, он отображается как неправильное выделение памяти. Предполагается, что код проходит бинарное дерево по зигзагообразному шаблону.
Способ найти ошибку состоит в том, чтобы скомпилировать код, исправить ошибки компилятора, затем написать тесты, сделать все тесты пройденными, а затем использовать отладчик. шаг 1 уже не работает godbolt.org/z/jTWbPxMYW
Я не могу найти ошибку. Вы написали код, у вас есть тестовый пример, поэтому нет оправдания тому, что вы не можете найти ошибку (посредством отладки), чтобы увидеть, где в вашем коде она идет вразрез с вашими ожиданиями. . Как исправить ошибку — это отдельная история, но, по крайней мере, вы должны выяснить, где ваш код не делает того, что вы ожидаете. Помните, вы написали код.
v.push_back(curr->data);
-- Что, если curr
это nullptr
? Вы разыменовываете нулевой указатель, что приводит к неопределенному поведению.
@PaulMcKenzie Для небольших входных данных он работает, но для больших входных данных он даже не компилируется, что показывает плохое распределение памяти.
@PaulMcKenzie Я не думаю, что на данный момент curr может быть нулевым.
@user21141068 user21141068, но для больших входных данных он даже не компилируется, -- Что вы подразумеваете под «даже не компилируется»? Если программа запускается, она уже "скомпилирована". Просто в вашей программе есть ошибка, которую вы не обнаружили, и, вероятно, не имеет значения, насколько велик входной сигнал. Вы просто не нашли тестовый пример, где он терпит неудачу.
@ user21141068 Ошибка может быть в другой части кода. Как, например, когда вы вставляете узлы в дерево. Это очень распространенная точка ошибок для деревьев.
@PaulMcKenzie curr будет nullptr только в случае ms.empty() == true , в этом случае цикл прерывается.
@ user21141068 -- Пожалуйста, опубликуйте минимально воспроизводимый пример . Во-первых, неясно, что должен обозначать «зигзаг». Во-вторых, у нас нет main программы с тестовыми данными. Вам дали эту ссылку. Это состояние кода, который вы нам дали — видите ошибки? Перейдите по этой ссылке, исправьте ошибки, добавьте main и опубликуйте код здесь.
Curr будет nullptr только в случае ms.empty() == true , в этом случае цикл прерывается. -- Я не вижу подтверждения этого в коде, который вы разместили. Вы предполагали это, но проверили ли вы это? Возможно, возможно: if (!curr) { cout << "I messed up"; } сразу после получения топового предмета? Все, что я вижу, это доступ к curr, как если бы он был действительным, и я понятия не имею, что это может быть. Учитывая ошибку времени выполнения и тот небольшой код, который вы разместили, это один из логических выводов о том, почему программа рухнет.
В следующий раз, когда вы опубликуете, пожалуйста, сделайте то, что предложили другие:
У вас бесконечный цикл, потому что вы всегда добавляете потомков корня, а не потомков текущего узла.
Cs.push(root->left); должен быть cs.push(curr->left); во всех четырех местах. (Замените левый на правый, где это уместно.)
Используйте полные слова в качестве имен переменных, например current, вместо curr. Тогда у вас будет меньше шансов перепутать его с чем-то похожим, например root.
Именование — одна из самых сложных проблем, и она приводит ко многим ошибкам, подобным той, что была у вас.
Спасибо, я здесь новенький, в следующий раз буду понятен.
Конечно, я забыл сказать, добро пожаловать в Stack Overflow :)
Что должен делать этот код? Пожалуйста, предоставьте более подробную информацию. Кроме того, вы вообще пытались отлаживать?