Вы изменяете стек в первой строке здесь
dfs.push(dfs.top()->left);
visited.insert({dfs.top()->left});
то, что вы хотите сделать, это отметить предыдущий dfs.top()->left
как посещенный, но вы добавляете больше элементов поверх стека и таким образом, новый dfs.top()
является другим.
Чтобы решить эту проблему, вы должны использовать сохранение предыдущего dfs.top()->left
в другой переменной.
Лучше всего использовать переменную или объект над которым вы работаете, должен быть неизменяемым, поскольку стек не является неизменяемым, не используйте его top
при вставке в него или выполнении некоторых других вычислений. Вместо этого сохраните требуемую переменную во что-то неизменяемое, например temp
здесь
temp = dfs.top();
if (temp->left != nullptr && visited.find(temp->left) == visited.end()) {
dfs.push(temp->left);
visited.insert({temp->left});
}
else {
sol.push_back(dfs.top()->val);
dfs.pop();
if (temp->right != nullptr && visited.find(temp->right) == visited.end()) {
dfs.push(temp->right);
visited.insert({temp->right});
}
}