算法leetcode每日一练2265. 统计值等于子树平均值的节点数
Posted 二当家的白帽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode每日一练2265. 统计值等于子树平均值的节点数相关的知识,希望对你有一定的参考价值。
文章目录
- 2265. 统计值等于子树平均值的节点数:
- 样例 1:
- 样例 2:
- 提示:
- 分析
- 题解
- 原题传送门:https://leetcode.cn/problems/count-nodes-equal-to-average-of-subtree/
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. 统计是给定字符串前缀的字符串数目