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
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
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++
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
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
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 := []int{0, 0}
ans += dfs(root.Left, lArr)
arr[0] += lArr[0]
arr[1] += lArr[1]
}
if root.Right != nil {
rArr := []int{0, 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, []int{0, 0})
}
rust
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
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://le-yi.blog.csdn.net/ 博客原创~
|