Ваш алгоритм появляется из стека, предполагая, что всегда будет что-то. Но как тогда ptr становится NULL для завершения второго цикла?
Как следствие, ваш счетчик стека переходит в отрицательный вызывающий UB, который (к счастью) выражается в виде ошибки времени выполнения.
Улучшение 1: определить конец
Вы попытались написать push()
. Приложите дополнительные усилия для написания pop()
. Убедитесь, что ваш алгоритм проверяет наличие пустого стека или что pop()
возвращает nullptr
, если стек пуст:
Node* pop()
{
if (TOP>=0) {
return STACK[TOP--];
}
else {
return nullptr;
}
}
Конечно, замените следующие последовательности на ptr = pop();
:
ptr = STACK[TOP];
TOP--;
Все pop()
сопровождаются проверкой указателя на нулевое значение, за исключением использования ptr после goto
. Поэтому вам нужно добавить дополнительное условие, чтобы избежать этой ситуации:
if(flag && ptr)
goto top;
Когда вы затем запустите программу, она отобразит элементы, но вы увидите, что недостаточное выполнение завершает процесс.
Улучшение 2: избавиться от goto
Мы находимся в 21-м веке: goto
больше не является смертельным исходом, и лучше избегать в C ++, если это возможно .
Внешняя петля может элегантно заменить goto. Затем вы также можете избавиться от флага:
void stackTraversal(Node *root)
{
...
while(ptr) // outer loop: no more goto
{
while(ptr) { // push the full left
push(ptr);
ptr = ptr->left;
}
ptr = pop(); // pop top node
while(ptr)
{
cout << ptr->data << " ";
cout.flush(); // in case of weird things happening afterwards
if(ptr->right) { // explore its right branch
ptr = ptr->right;
break; // this goes back to outer loop
}
else ptr = pop();
}
}
cout << "\nTHE END\n";
}
Демо онлайн