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

C++求节点总数程序:为何这段递归函数会出现段错误?

问题分析与修复方案

嘿,我一眼就揪出导致段错误的元凶啦!

1. 触发段错误的核心原因

你的代码里有个非常容易踩的C++语法坑:把赋值运算符=当成了相等判断运算符==。

看这段代码:

if (root = NULL) { return 0; }

这里的root = NULL是将NULL赋值给root,而不是判断root是否为空。这会导致两个致命问题:

  • 哪怕传入的root原本是有效的非空节点,经过这个赋值操作后,root会被强制改成NULL
  • 接下来你尝试访问root->left和root->right,本质是对NULL指针进行解引用——这是C++里绝对禁止的操作,直接触发段错误(Segmentation Fault),因为NULL指针指向的内存区域是程序无权访问的。

修复后的判断逻辑

把赋值改成相等判断即可:

if (root == NULL) {
    return 0;
}

2. 额外提醒:函数名与逻辑不匹配

你的函数名为countLeaves(统计叶子节点),但当前代码的逻辑是统计所有节点的总数(返回1 + left + right,每个节点都被计数一次)。如果你的真实需求是统计叶子节点(即左右子节点都为NULL的节点),那需要调整逻辑:

int countLeaves(Node* root) {
    if (root == NULL) {
        return 0;
    }
    // 叶子节点的判定:左右孩子都为空
    if (root->left == NULL && root->right == NULL) {
        return 1;
    }
    // 非叶子节点:递归统计左右子树的叶子节点数
    return countLeaves(root->left) + countLeaves(root->right);
}

内容的提问来源于stack exchange,提问作者Shishir hegde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:22:57