You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:31:01