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

