Maximum Average Subtree

medium binary tree dfs post-order

Problem

Given the root of a binary tree, return the maximum average value of any subtree of that tree. A subtree of a node consists of that node together with all of its descendants. The average value of a subtree is the sum of all its node values divided by the number of those nodes.

Inputroot = [5, 6, 1]
Output6.00000
The whole tree averages (5 + 6 + 1) / 3 = 4. The single node 6 averages 6, the single node 1 averages 1. The largest average is 6.

def maximum_average_subtree(root):
    best = 0.0
    def dfs(node):
        nonlocal best
        if not node:
            return (0, 0)
        ls, lc = dfs(node.left)
        rs, rc = dfs(node.right)
        s = ls + rs + node.val
        c = lc + rc + 1
        best = max(best, s / c)
        return (s, c)
    dfs(root)
    return best
function maximumAverageSubtree(root) {
  let best = 0;
  function dfs(node) {
    if (!node) return [0, 0];
    const [ls, lc] = dfs(node.left);
    const [rs, rc] = dfs(node.right);
    const s = ls + rs + node.val;
    const c = lc + rc + 1;
    best = Math.max(best, s / c);
    return [s, c];
  }
  dfs(root);
  return best;
}
class Solution {
    double best = 0;
    public double maximumAverageSubtree(TreeNode root) {
        dfs(root);
        return best;
    }
    private int[] dfs(TreeNode node) {
        if (node == null) return new int[]{0, 0};
        int[] l = dfs(node.left);
        int[] r = dfs(node.right);
        int s = l[0] + r[0] + node.val;
        int c = l[1] + r[1] + 1;
        best = Math.max(best, (double) s / c);
        return new int[]{s, c};
    }
}
class Solution {
public:
    double best = 0;
    double maximumAverageSubtree(TreeNode* root) {
        dfs(root);
        return best;
    }
    pair<int, int> dfs(TreeNode* node) {
        if (!node) return {0, 0};
        auto l = dfs(node->left);
        auto r = dfs(node->right);
        int s = l.first + r.first + node->val;
        int c = l.second + r.second + 1;
        best = max(best, (double) s / c);
        return {s, c};
    }
};
Time: O(n) Space: O(h)