算法leetcode每日一练2265. 统计值等于子树平均值的节点数

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode每日一练2265. 统计值等于子树平均值的节点数相关的知识,希望对你有一定的参考价值。


文章目录


2265. 统计值等于子树平均值的节点数:

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

提示:

  • 树中节点数目在范围 [1, 1000] 内
  • 0 <= Node.val <= 1000

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 需要有变量去记录子树的节点数以及值的和。
  • c和c++如果在堆上开辟内存需要手动释放,而且访问速度可能还不如栈内存快。

题解

java

/**
 * 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 
    public int averageOfSubtree(TreeNode root) 
        return dfs(root, new int[]0, 0);
	

	private int dfs(TreeNode root, int[] arr) 
		int ans = 0;
		arr[0] = root.val;
		arr[1] = 1;

		if (root.left != null) 
			int[] lArr = new int[2];
			ans += dfs(root.left, lArr);
			arr[0] += lArr[0];
			arr[1] += lArr[1];
		

		if (root.right != null) 
			int[] rArr = new int[2];
			ans += dfs(root.right, rArr);
			arr[0] += rArr[0];
			arr[1] += rArr[1];
		

		if (arr[0] / arr[1] == root.val) 
			++ans;
		

		return ans;
	


c

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * ;
 */

int dfs(struct TreeNode* root, int arr[2]) 
    int ans = 0;
    arr[0] = root->val;
    arr[1] = 1;

    if (root->left) 
        int lArr[2];
        ans += dfs(root->left, lArr);
        arr[0] += lArr[0];
        arr[1] += lArr[1];
    

    if (root->right) 
        int rArr[2];
        ans += dfs(root->right, rArr);
        arr[0] += rArr[0];
        arr[1] += rArr[1];
    

    if (arr[0] / arr[1] == root->val) 
        ++ans;
    

    return ans;


int averageOfSubtree(struct TreeNode* root)
    int arr[2];
    return dfs(root, arr);


c++

/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) 
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) 
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) 
 * ;
 */
class Solution 
private:
    int dfs(TreeNode* root, int& val, int& cnt) 
        int ans = 0;
        val = root->val;
        cnt = 1;

        if (root->left) 
            int l_val, l_cnt;
            ans += dfs(root->left, l_val, l_cnt);
            val += l_val;
            cnt += l_cnt;
        

        if (root->right) 
            int r_val, r_cnt;
            ans += dfs(root->right, r_val, r_cnt);
            val += r_val;
            cnt += r_cnt;
        

        if (val / cnt == root->val) 
            ++ans;
        

        return ans;
    
public:
    int averageOfSubtree(TreeNode* root) 
        int val, cnt;
        return dfs(root, val, cnt);
    
;

python

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def averageOfSubtree(self, root: Optional[TreeNode]) -> int:
        def dfs(root: Optional[TreeNode], arr: List[int]) -> int:
            ans = 0
            arr[0] = root.val
            arr[1] = 1
            if root.left:
                l_arr = [0, 0]
                ans += dfs(root.left, l_arr)
                arr[0] += l_arr[0]
                arr[1] += l_arr[1]
            if root.right:
                r_arr = [0, 0]
                ans += dfs(root.right, r_arr)
                arr[0] += r_arr[0]
                arr[1] += r_arr[1]
            if arr[0] // arr[1] == root.val:
                ans += 1
            return ans
        return dfs(root, [0, 0])
        

go

/**
 * Definition for a binary tree node.
 * type TreeNode struct 
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * 
 */
func averageOfSubtree(root *TreeNode) int 
    var dfs func(root *TreeNode, arr []int) int
	dfs = func(root *TreeNode, arr []int) int 
		ans := 0
		arr[0], arr[1] = root.Val, 1
        
		if root.Left != nil 
			lArr := []int0, 0
			ans += dfs(root.Left, lArr)
			arr[0] += lArr[0]
			arr[1] += lArr[1]
		

		if root.Right != nil 
			rArr := []int0, 0
			ans += dfs(root.Right, rArr)
			arr[0] += rArr[0]
			arr[1] += rArr[1]
		

		if arr[0] / arr[1] == root.Val 
			ans++
		

		return ans
	

	return dfs(root, []int0, 0)


rust

// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode 
//   pub val: i32,
//   pub left: Option<Rc<RefCell<TreeNode>>>,
//   pub right: Option<Rc<RefCell<TreeNode>>>,
// 
//
// impl TreeNode 
//   #[inline]
//   pub fn new(val: i32) -> Self 
//     TreeNode 
//       val,
//       left: None,
//       right: None
//     
//   
// 
use std::rc::Rc;
use std::cell::RefCell;
impl Solution 
    pub fn average_of_subtree(root: Option<Rc<RefCell<TreeNode>>>) -> i32 
        fn dfs(root: Option<Rc<RefCell<TreeNode>>>, val: &mut i32, cnt: &mut i32) -> i32 
            match root 
                Some(root) => 
                    let mut root = root.borrow_mut();

                    let mut ans = 0;
                    *val = root.val;
                    *cnt = 1;

                    let mut lVal = 0;
                    let mut lCnt = 0;
                    ans += dfs(root.left.take(), &mut lVal, &mut lCnt);
                    *val += lVal;
                    *cnt += lCnt;

                    let mut rVal = 0;
                    let mut rCnt = 0;
                    ans += dfs(root.right.take(), &mut rVal, &mut rCnt);
                    *val += rVal;
                    *cnt += rCnt;

                    if *val / *cnt == root.val 
                        ans += 1;
                    

                    ans
                ,
                _ => 0
            

        

        dfs(root, &mut 0, &mut 0)
    


typescript

/**
 * Definition for a binary tree node.
 * class TreeNode 
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) 
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     
 * 
 */

function averageOfSubtree(root: TreeNode | null): number 
    const dfs = (root: TreeNode | null, arr: number[]): number => 
        let ans = 0;
        arr[0] = root.val;
        arr[1] = 1;

        if (root.left) 
            let lArr = [0, 0];
            ans += dfs(root.left, lArr);
            arr[0] += lArr[0];
            arr[1] += lArr[1];
        

        if (root.right) 
            let rArr = [0, 0];
            ans += dfs(root.right, rArr);
            arr[0] += rArr[0];
            arr[1] += rArr[1];
        

        if (Math.floor(arr[0] / arr[1]) == root.val) 
            ans += 1;
        

        return ans;
    ;

    return dfs(root, [0, 0]);
;


原题传送门:https://leetcode.cn/problems/count-nodes-equal-to-average-of-subtree/


非常感谢你阅读本文~
欢迎【👍点赞】【⭐收藏】【📝评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


以上是关于算法leetcode每日一练2265. 统计值等于子树平均值的节点数的主要内容,如果未能解决你的问题,请参考以下文章

算法leetcode每日一练2044. 统计按位或能得到最大值的子集数目

算法leetcode每日一练2255. 统计是给定字符串前缀的字符串数目

算法leetcode每日一练2161. 根据给定数字划分数组

算法leetcode每日一练1614. 括号的最大嵌套深度

算法leetcode每日一练2130. 链表最大孪生和

算法leetcode每日一练2220. 转换数字的最少位翻转次数