Count Nodes Equal to Average of Subtree - Simple recursion in O(n) TC
Problem Statement:
Given the root
of a binary tree, return the number of nodes where the value of the node is equal to the average of the values in its subtree.
Note:
- The average of
n
elements is the sum of then
elements divided byn
and rounded down to the nearest integer. - A subtree of
root
is a tree consisting ofroot
and all of its descendants.
Example 1:
Input: root = [4,8,5,0,1,null,6] Output: 5 Explanation: For the node with value 4: The average of its subtree is (4 + 8 + 5 + 0 + 1 + 6) / 6 = 24 / 6 = 4. For the node with value 5: The average of its subtree is (5 + 6) / 2 = 11 / 2 = 5. For the node with value 0: The average of its subtree is 0 / 1 = 0. For the node with value 1: The average of its subtree is 1 / 1 = 1. For the node with value 6: The average of its subtree is 6 / 1 = 6.
Example 2:
Input: root = [1] Output: 1 Explanation: For the node with value 1: The average of its subtree is 1 / 1 = 1.
Constraints:
- The number of nodes in the tree is in the range
[1, 1000]
. 0 <= Node.val <= 1000
Solution:
We just keep track of (a) the sum of node values and (b) the number of nodes as pair<int,int>
in a recursive function and update the answer in a variable res
.
class Solution {
int res;
public:
pair<int,int> treeAvg(TreeNode *root)
{
if (!root) return {-1,-1};
pair<int,int> avgL = treeAvg(root->left), avgR = treeAvg(root->right);
int sum=0, cnt=0;
if (avgL.first!=-1) {sum+=avgL.first; cnt+=avgL.second;}
if (avgR.first!=-1) {sum+=avgR.first; cnt+=avgR.second;}
sum += root->val; cnt++;
if (sum/cnt==root->val) res++;
return {sum,cnt};
}
int averageOfSubtree(TreeNode* root)
{
res = 0;
treeAvg(root);
return res;
}
};