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

二叉树节点计数:提交代码至在线判题系统结果错误求助

二叉树节点计数问题排查

问题背景

我在解决GeeksForGeeks的《Size of Binary Tree》问题,题目要求统计给定二叉树的节点总数。示例二叉树的节点数为4:

1
     / \
   10   39
  /
 5

测试用例异常情况

输入:

2 // 测试用例数量
1 2 3 // 测试用例#1
10 5 9 N 1 3 6  // 测试用例#2

我的输出:

3
9

预期输出:

3
6

错误代码

/* Tree node structure  used in the program
 struct Node
 {
     int data;
     Node* left;
     Node* right;
}; */

/* Computes the number of nodes in a tree. */

int nodes=0;

void dfs(Node* node) {
    if (node==NULL) return;
    ++nodes;
    // cout << node->data << " ";
    dfs(node->left);
    dfs(node->right);
}

int getSize(Node* node)
{
   // Your code here
   dfs(node);
   return nodes;
}

问题根源

你使用了**全局变量nodes**来计数,全局变量的生命周期覆盖整个程序运行期间。第一个测试用例执行后,nodes的值变为3;第二个测试用例运行时,nodes不会自动重置为0,而是在3的基础上继续累加第二个树的6个节点,最终得到3+6=9,与预期结果不符。

修复方案

有两种常见的修复方式:

方式1:将计数变量改为局部变量

在getSize函数内初始化局部计数变量,避免全局状态污染:

void dfs(Node* node, int &count) {
    if (node == NULL) return;
    ++count;
    dfs(node->left, count);
    dfs(node->right, count);
}

int getSize(Node* node)
{
   int nodes = 0;
   dfs(node, nodes);
   return nodes;
}

方式2:让DFS递归返回节点数

无需额外计数变量,直接通过递归返回值累加:

int getSize(Node* node)
{
   if (node == NULL) return 0;
   return 1 + getSize(node->left) + getSize(node->right);
}

这种方式更简洁,也避免了全局/引用变量的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:25:51