Input: root =[4,8,5,0,1,null,6]Output: 5Explanation:
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 is0/1=0.For the node with value 1: The average of its subtree is1/1=1.For the node with value 6: The average of its subtree is6/1=6.
For each node, we need to know the sum and count of all nodes in its subtree. We can use postorder DFS to compute these values for every node efficiently.
classTreeNode {
int val;
TreeNode left, right;
TreeNode(int x) { val = x; }
}
classSolution {
int ans = 0;
privateint[]dfs(TreeNode node) {
if (node ==null) returnnewint[]{0, 0};
int[] l = dfs(node.left), r = dfs(node.right);
int s = l[0]+ r[0]+ node.val, c = l[1]+ r[1]+ 1;
if (node.val== s / c) ans++;
returnnewint[]{s, c};
}
publicintaverageOfSubtree(TreeNode root) {
ans = 0;
dfs(root);
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dataclassTreeNode(var `val`: Int, var left: TreeNode? = null, var right: TreeNode? = null)
classSolution {
var ans = 0funaverageOfSubtree(root: TreeNode?): Int {
ans = 0fundfs(node: TreeNode?): Pair<Int, Int> {
if (node ==null) return0 to 0val(ls, lc) = dfs(node.left)
val(rs, rc) = dfs(node.right)
val s = ls + rs + node.`val`
val c = lc + rc + 1if (node.`val` == s / c) ans++return s to c
}
dfs(root)
return ans
}
}