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
相关产品推荐
相关产品推荐

