Binary Tree     C++     Depth-First Search     Medium     Recursion     Tree    

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 the n elements divided by n and rounded down to the nearest integer.
  • A subtree of root is a tree consisting of root 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;
    }
};