力扣刷题——2265.统计值等于子树平均值的节点数
给你一棵二叉树的根节点 root
,找出并返回满足要求的节点数,要求节点的值等于其 子树 中值的 平均值 。
注意:
n
个元素的平均值可以由n
个元素 求和 然后再除以n
,并 向下舍入 到最近的整数。root
的 子树 由root
和它的所有后代组成。
示例 1:
输入:root = [4,8,5,0,1,null,6] 输出:5 解释: 对值为 4 的节点:子树的平均值 (4 + 8 + 5 + 0 + 1 + 6) / 6 = 24 / 6 = 4 。 对值为 5 的节点:子树的平均值 (5 + 6) / 2 = 11 / 2 = 5 。 对值为 0 的节点:子树的平均值 0 / 1 = 0 。 对值为 1 的节点:子树的平均值 1 / 1 = 1 。 对值为 6 的节点:子树的平均值 6 / 1 = 6 。
思路:
我们要得到当前节点的子节点的平均值,核心是在递归中记录当前节点的子节点数和它们值的和。可以利用pair,一次将两个值都放进去进行叠加, 最后进行/操作,判断结果是否等于当前节点的值。
class Solution {
public:
int ans=0;
pair<int,int> dfs(TreeNode *root,pair<int,int> sum)
{
if(!root)
{
return {0,0};
}
auto lp=dfs(root->left,sum);
auto lr=dfs(root->right,sum);
sum.first+=lp.first+lr.first+root->val;
sum.second+=lp.second+lr.second+1;
if(sum.first/sum.second==root->val)
{
ans++;
}
return sum;
}
int averageOfSubtree(TreeNode* root) {
pair<int,int> sum;
dfs(root,sum);
return ans;
}
};