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

C语言DFS实现统计子树平均值节点数功能遇错求助

问题分析与修正

你的代码存在三个核心错误,直接导致运行结果错误:

1. 函数返回值不符合C语言语法

C语言中函数只能返回单个值,你试图通过return 0,0;和return totalSum,count;返回两个值(子树总和、节点数)是完全错误的。逗号表达式在这里只会返回最后一个元素的值,所以dfs实际只返回了节点数(或0),子树总和的取值完全错误。

2. 变量赋值逻辑错误

int left,left_count = dfs(root->left);这种写法仅将dfs的返回值赋值给left_count,left会被初始化为随机垃圾值,直接导致后续总和计算完全错误。

3. 全局变量的复用问题

全局变量ans如果多次调用averageOfSubtree函数,会保留上一次的计算结果,导致后续调用输出错误。


修正后的代码

我们可以定义一个结构体来同时返回子树总和和节点数,避免上述问题:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

// 定义结构体存储子树总和与节点数
typedef struct {
    int sum;
    int count;
} SubtreeInfo;

int ans = 0;

SubtreeInfo dfs(struct TreeNode* root) {
    SubtreeInfo info = {0, 0};
    if (root == NULL) {
        return info;
    }
    // 递归获取左右子树的信息
    SubtreeInfo leftInfo = dfs(root->left);
    SubtreeInfo rightInfo = dfs(root->right);
    
    // 计算当前子树的总和与节点数
    info.sum = leftInfo.sum + rightInfo.sum + root->val;
    info.count = leftInfo.count + rightInfo.count + 1;
    
    // 判断平均值是否等于当前节点值(注意整数除法的特性)
    if (info.sum / info.count == root->val) {
        ans++;
    }
    return info;
}

int averageOfSubtree(struct TreeNode* root) {
    ans = 0; // 每次调用前重置计数器,避免全局变量残留
    dfs(root);
    return ans;
}

或者也可以用指针传递的方式代替结构体,避免定义额外类型:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int ans = 0;

int dfs(struct TreeNode* root, int* count) {
    if (root == NULL) {
        *count = 0;
        return 0;
    }
    int leftCount, rightCount;
    int leftSum = dfs(root->left, &leftCount);
    int rightSum = dfs(root->right, &rightCount);
    
    *count = leftCount + rightCount + 1;
    int totalSum = leftSum + rightSum + root->val;
    
    if (totalSum / *count == root->val) {
        ans++;
    }
    return totalSum;
}

int averageOfSubtree(struct TreeNode* root) {
    ans = 0;
    int dummy;
    dfs(root, &dummy);
    return ans;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:50:14