C++实现Zigzag遍历触发SIGABRT运行时错误,求问题排查
问题排查:二叉树Zigzag遍历的SIGABRT错误
你的代码触发内存分配异常(SIGABRT)的核心原因是错误地重复将根节点的子节点压入辅助栈,导致程序进入无限循环,最终耗尽内存。
具体错误点分析
在处理当前节点的子节点时,你误用了root->left和root->right,而非当前遍历到的节点curr的子节点curr->left和curr->right:
// 错误代码片段 if (i % 2 != 0) { if (curr->left != NULL) { cs.push(root->left); // 应改为curr->left } if (curr->right != NULL) { cs.push(root->right); // 应改为curr->right } } if (i % 2 == 0) { if (curr->right != NULL) { cs.push(root->right); // 应改为curr->right } if (curr->left != NULL) { cs.push(root->left); // 应改为curr->left } }
这个错误会导致:每次处理任意节点时,都往栈中压入根节点的子节点,而非当前节点的子节点。循环会无限重复处理根节点的子节点,栈的大小持续膨胀,最终触发内存分配失败,系统发送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()) { Node* curr = ms.top(); ms.pop(); v.push_back(curr->data); if (i % 2 != 0) { // 奇数层:先压左子节点,再压右子节点(下一层从右到左遍历) if (curr->left != NULL) { cs.push(curr->left); } if (curr->right != NULL) { cs.push(curr->right); } } else { // 偶数层:先压右子节点,再压左子节点(下一层从左到右遍历) if (curr->right != NULL) { cs.push(curr->right); } if (curr->left != NULL) { cs.push(curr->left); } } if (ms.empty()) { cs.swap(ms); ++i; } } } vector<int> zigZagTraversal(Node* root) { vector<int> v; int i = 1; solve(root, v, i); return v; } };
额外说明
修正后,程序会正确遍历每个节点的子节点,栈的大小会随遍历层级正常增减,不会出现内存溢出。同时注意Zigzag遍历的核心逻辑:奇数层从左到右遍历,子节点按左→右顺序压栈(下一层弹出时为右→左);偶数层则相反,子节点按右→左顺序压栈。
内容的提问来源于stack exchange,提问作者user21141068
相关产品推荐
相关产品推荐

