【LeetCode】统计值等于子树平均值的节点数Java题解

146 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

题目描述

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-nodes-equal-to-average-of-subtree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是二叉树的题目,题目要求找出并返回满足要求的节点数,要求节点的值等于其子树中值的 平均值 。
  • 分析之后,需要分别求出当前节点的值和子树的平均值。做树相关的题目,我们通常使用深度优先遍历或者广度优先遍历。具体到这个题目,我们采用数组的形式保存,数组元素0表示当前节点的和,数组元素1表示当前节点的数目的和。有了这两个参数,我们就可以求平均数了。
  • 具体实现代码如下,供参考。

通过代码

/**
 * 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 ans = 0;
    public int averageOfSubtree(TreeNode root) {
        dfs(root);
        return ans;
    }

    private int[] dfs(TreeNode node) {
        if (node == null) {
            return new int[]{0, 0};
        }
        int[] left = dfs(node.left);
        int[] right = dfs(node.right);

        int sum = left[0] + right[0] + node.val;
        int nodeNum = left[1] + right[1] + 1;
        int avg = sum / nodeNum;
        if (avg == node.val) {
            ans++;
        }

        return new int[]{sum, nodeNum};
    } 
}

总结

  • 上述算法的时间复杂度是O(n), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!