Welcome to Subscribe On Youtube

Question

Formatted question description: https://leetcode.ca/all/1120.html


 Given the root of a binary tree, find the maximum average value of any subtree of that tree.

 (A subtree of a tree is any node of that tree plus all its descendants.
 The average value of a tree is the sum of its values, divided by the number of nodes.)


 Example 1:

 Input: [5,6,1]
 Output: 6.00000
 Explanation:
     For the node with value = 5 we have an average of (5 + 6 + 1) / 3 = 4.
     For the node with value = 6 we have an average of 6 / 1 = 6.
     For the node with value = 1 we have an average of 1 / 1 = 1.
     So the answer is 6 which is the maximum.


 Note:
     The number of nodes in the tree is between 1 and 5000.
     Each node will have a value between 0 and 100000.
     Answers will be accepted as correct if they are within 10^-5 of the correct answer.

Algorithm

DFS Define a pair<int, int> for each node, the first position represents the sum of the subtree values rooted at that node, and the second position represents the number of nodes of the subtree; Accumulate these two values of each node from the top; The average number of subtrees is the sum/node, which is stored using a global variable; Use dictionaries for memoized searches to speed up

Code

  • 
    public class Maximum_Average_Subtree {
    
        /**
         * Definition for a binary tree node.
         * public class TreeNode {
         *     int val;
         *     TreeNode left;
         *     TreeNode right;
         *     TreeNode() {}
         *     TreeNode(int val) { this.val = val; }
         *     TreeNode(int val, TreeNode left, TreeNode right) {
         *         this.val = val;
         *         this.left = left;
         *         this.right = right;
         *     }
         * }
         */
    
        class Solution {
    
            double max = Integer.MIN_VALUE;
    
            public double maximumAverageSubtree(TreeNode root) {
                dfs(root);
                return max;
            }
    
            // double[]: sum, count
            private double[] dfs(TreeNode root) {
                if (root == null) {
                    return new double[]{0, 0};
                }
    
                double[] l = dfs(root.left);
                double[] r = dfs(root.right);
                double sum = root.val + l[0] + r[0];
                double count = l[1] + r[1] + 1;
    
                double avg = sum / count;
                if (avg > max) {
                    max = avg;
                }
    
                return new double[]{sum, count};
            }
        }
    }
    
    
  • // OJ: https://leetcode.com/problems/maximum-average-subtree/
    // Time: O(N)
    // Space: O(H)
    class Solution {
        double ans = 0;
        pair<int, int> dfs(TreeNode *root) {
            if (!root) return {0,0};
            auto left = dfs(root->left), right = dfs(root->right);
            int sum = left.first + right.first + root->val, cnt = left.second + right.second + 1;
            ans = max(ans, (double)sum / cnt);
            return {sum, cnt};
        }
    public:
        double maximumAverageSubtree(TreeNode* root) {
            dfs(root);
            return ans;
        }
    };
    
  • # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def maximumAverageSubtree(self, root: TreeNode) -> float:
            def dfs(root):
                if root is None:
                    return 0, 0
                ls, ln = dfs(root.left)
                rs, rn = dfs(root.right)
                s = ls + root.val + rs
                n = ln + 1 + rn
                nonlocal ans
                ans = max(ans, s / n)
                return s, n
    
            ans = 0
            dfs(root)
            return ans
    
    
    
  • /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    func maximumAverageSubtree(root *TreeNode) (ans float64) {
    	var dfs func(*TreeNode) [2]int
    	dfs = func(root *TreeNode) [2]int {
    		if root == nil {
    			return [2]int{}
    		}
    		l, r := dfs(root.Left), dfs(root.Right)
    		s := root.Val + l[0] + r[0]
    		n := 1 + l[1] + r[1]
    		ans = math.Max(ans, float64(s)/float64(n))
    		return [2]int{s, n}
    	}
    	dfs(root)
    	return
    }
    

All Problems

All Solutions