给你一棵二叉树的根节点 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; } } }