给你一棵二叉树的根节点 root ,找出并返回满足要求的节点数,要求节点的值等于其 子树 中值的 平均值 。
注意:
n 个元素的平均值可以由 n 个元素 求和 然后再除以 n ,并 向下舍入 到最近的整数。
root 的 子树 由 root 和它的所有后代组成。
示例 1:
输入:root = [4,8,5,0,1,null,6]
输出:5
解释:
对值为 4 的节点:子树的平均值 (4 + 8 + 5 + 0 + 1 + 6) / 6 = 24 / 6 = 4 。
对值为 5 的节点:子树的平均值 (5 + 6) / 2 = 11 / 2 = 5 。
对值为 0 的节点:子树的平均值 0 / 1 = 0 。
对值为 1 的节点:子树的平均值 1 / 1 = 1 。
对值为 6 的节点:子树的平均值 6 / 1 = 6 。
示例 2:
输入:root = [1]
输出:1
解释:对值为 1 的节点:子树的平均值 1 / 1 = 1。
class Solution {
public int averageOfSubtree(TreeNode root) {
return dfs(root).count;
}
public Node dfs(TreeNode node) {
//如果是叶子节点
if (node.left == null && node.right == null) {
return new Node(1, node.val, 1);
}
Node result = new Node(node.val);
if (node.left != null) {
Node left = dfs(node.left);
result.addNode(left);
}
if (node.right != null) {
Node right = dfs(node.right);
result.addNode(right);
}
return result.execute();
}
class Node {
//积累的数量
int count;
//总和
int sum;
//节点数量
int subNodeCount;
//当前节点的值
int val;
public Node(int val) {
subNodeCount = 1;
sum = val;
this.val = val;
}
public Node(int count, int sum, int subNodeCount) {
this.count = count;
this.sum = sum;
this.subNodeCount = subNodeCount;
}
public void addNode(Node node) {
count = count + node.count;
sum = sum + node.sum;
subNodeCount = subNodeCount + node.subNodeCount;
}
public Node execute() {
if (sum / subNodeCount == val) {
System.out.println(val + ":" + sum);
count++;
}
return this;
}
}
}
给定一棵二叉树,找到所有节点值等于其子树中值的平均值的节点数量。例如,在给定的树中,有5个节点满足条件。算法通过深度优先搜索遍历树,计算每个节点的子树的平均值,并返回满足条件的节点数。
784

被折叠的 条评论
为什么被折叠?



