Complete-Preparation

🎉 One-stop destination for all your technical interview Preparation 🎉

View the Project on GitHub

3 637. Average of Levels in Binary Tree 🌟

Given the root of a binary tree, return the average value of the nodes on each level in the form of an array. Answers within 10-5 of the actual answer will be accepted.

This question is in continuation with A general approach to level order traversal questions series.

Previous Questions

  1. Binary tree level order traversal
  2. Binary tree level order traversal - II
  3. Binary tree zig-zag level order traversal

Recursive Solution

Code

class Solution {
private:
    void averageOfLevelsDFS(vector<double>& levelSum, vector<double>& levelCount, TreeNode* root, int level)
    {
        if (root == NULL)
            return;
        if (level == levelSum.size()) {
            levelSum.push_back(0.0);
            levelCount.push_back(0.0);
        }

        levelSum[level] += root->val;
        levelCount[level] += 1;

        averageOfLevelsDFS(levelSum, levelCount, root->left, level + 1);
        averageOfLevelsDFS(levelSum, levelCount, root->right, level + 1);
    }

public:
    vector<double> averageOfLevels(TreeNode* root)
    {
        vector<double> levelSum, levelCount;

        averageOfLevelsDFS(levelSum, levelCount, root, 0);

        int n = levelSum.size();
        for (int i = 0; i < n; i++) {
            levelSum[i] = levelSum[i] / levelCount[i];
        }
        return levelSum;
    }
};

Iterative Solution

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root)
    {
        vector<double> res;
        if (root == NULL)
            return res;

        queue<TreeNode*> q;
        q.push(root);

        while (!q.empty()) {
            int sz = q.size();
            double sum = 0;
            for (int i = 0; i < sz; i++) {
                TreeNode* node = q.front(); q.pop();

                if (node->left != NULL) q.push(node->left);
                if (node->right != NULL) q.push(node->right);

                sum += node->val;
            }
            res.push_back(sum / sz);
        }
        return res;
    }
};

Iterative Solution

code

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root)
    {
        vector<double> levelSum, levelCount;

        queue<TreeNode*> q;
        q.push(root);

        while (!q.empty()) {
            int n = q.size();
            levelSum.push_back(0.0);
            levelCount.push_back(0.0);
            for (int i = 0; i < n; i++) {
                TreeNode* node = q.front(); q.pop();

                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);

                levelSum[levelSum.size() - 1] += node->val;
                levelCount[levelCount.size() - 1] += 1;
            }
        }
        int n = levelSum.size();
        for (int i = 0; i < n; i++) {
            levelSum[i] = levelSum[i] / levelCount[i];
        }
        return levelSum;
    }
};