[LeetCode] 2265. Count Nodes Equal to Average of Subtree

Given the root of a binary tree, return the number of nodes where the value of the node is equal to the average of the values in its subtree.

Note:
The average of n elements is the sum of the n elements divided by n and rounded down to the nearest integer.
A subtree of root is a tree consisting of root and all of its descendants.

Example 1:
Input: root = [4,8,5,0,1,null,6]
Output: 5
Explanation:
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 is 0 / 1 = 0.
For the node with value 1: The average of its subtree is 1 / 1 = 1.
For the node with value 6: The average of its subtree is 6 / 1 = 6.

Example 2:
Input: root = [1]
Output: 1
Explanation: For the node with value 1: The average of its subtree is 1 / 1 = 1.

Constraints:
The number of nodes in the tree is in the range [1, 1000].
0 <= Node.val <= 1000

统计值等于子树平均值的节点数。

给你一棵二叉树的根节点 root ,找出并返回满足要求的节点数,要求节点的值等于其 子树 中值的 平均值 。
注意:
n 个元素的平均值可以由 n 个元素 求和 然后再除以 n ,并 向下舍入 到最近的整数。
root 的 子树 由 root 和它的所有后代组成。

思路

思路是后序遍历。因为题目让我们找的节点需要让其子树满足一些条件,这也就意味着对于任何一个节点,他需要从他的子节点获取一些信息,由此我们想到大致的思路是后序遍历。

那么具体一点,子节点需要往父节点传什么信息呢?因为要求的是子树中所有节点 val 的平均值,那么我们需要收集所有子节点的 node.val 和子节点的个数这两个信息。这里我用一个数组保存。其他部分就比较直观了。

复杂度

时间O(n)
空间O(n)

代码

Java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
* 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 {
int count;

public int averageOfSubtree(TreeNode root) {
count = 0;
if (root == null) {
return count;
}
helper(root);
return count;
}

// [sum, count of nodes]
private int[] helper(TreeNode root) {
if (root == null) {
return new int[] { 0, 0 };
}
int[] left = helper(root.left);
int[] right = helper(root.right);
int sum = left[0] + right[0] + root.val;
int nodeCount = left[1] + right[1] + 1;
if (root.val == sum / nodeCount) {
count++;
}
return new int[] { sum, nodeCount };
}
}

[LeetCode] 2265. Count Nodes Equal to Average of Subtree
https://shurui91.github.io/posts/763011099.html
Author
Aaron Liu
Posted on
November 6, 2023
Licensed under