LeetCode 94迭代式DFS中序遍历遇内存超限,求原因及建议
LeetCode 94题迭代式中序遍历内存超限问题解答
问题1:是否不建议使用continue?
continue本身没问题,它只是用来跳过当前循环剩余语句、直接进入下一轮循环的语法,合理使用不会引发内存问题。你代码里的问题不是continue这个关键字导致的,而是用它实现的逻辑有漏洞。
问题2:内存超限的原因是什么?
你的代码存在死循环重复压栈的问题:
当处理一个带左子节点的节点时,你把左子节点压入栈后用continue跳过后续操作。等左子节点处理完弹出后,循环会再次回到原节点,此时原节点的左子节点依然存在,你又会再次把左子节点压入栈——这个过程会无限重复,栈里的元素会越来越多,最终触发内存超限。
举个例子:假设节点A有左子节点B,第一次循环压入B,continue;B处理完弹出后,回到A,又检测到A的左子节点B存在,再次压入B,无限循环,栈里会不断积累B节点,内存直接爆掉。
修正后的代码
正确的迭代式中序遍历应该先遍历到最左节点,回溯处理节点后再处理右子树,避免重复压栈:
class Solution { public: vector<int> inorderTraversal(TreeNode* root) { vector<int> ans; vector<TreeNode*> stack; TreeNode* current = root; while (current != nullptr || !stack.empty()) { // 先走到当前节点的最左子节点,沿途节点全部压栈 while (current != nullptr) { stack.push_back(current); current = current->left; } // 弹出栈顶节点,加入结果集 current = stack.back(); stack.pop_back(); ans.push_back(current->val); // 转向处理右子树 current = current->right; } return ans; } };
内容的提问来源于stack exchange,提问作者my_first_step
相关产品推荐
相关产品推荐

