题目地址:
https://leetcode.com/problems/maximum-average-subtree/
给定一个二叉树,求其平均值最大的子树,返回最大平均值。
思路是DFS。枚举树根,先递归求解左右子树各自节点数、总和,然后求出当前节点为树根的子树的平均值,更新答案,然后将当前子树的节点、总和返回给上层。最后返回答案。代码如下:
public class Solution {
private double res;
public double maximumAverageSubtree(TreeNode root) {
dfs(root);
return res;
}
private int[] dfs(TreeNode cur) {
// 如果是空树,则节点数和总和都是0
if (cur == null) {
return new int[]{0, 0};
}
int[] left = dfs(cur.left), right = dfs(cur.right);
int count = left[0] + right[0] + 1, sum = left[1] + right[1] + cur.val;
// 枚举cur为树根的情形,更新答案
res = Math.max(res, (double) sum / count);
return new int[]{count, sum};
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。