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

【算法leetcode每日一练】2265. 统计值等于子树平均值的节点数,第1张


文章目录
  • 2265. 统计值等于子树平均值的节点数:
  • 样例 1:
  • 样例 2:
  • 提示:
  • 分析
  • 题解
    • java
    • c
    • c++
    • python
    • go
    • rust
    • typescript
  • 原题传送门: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 := []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
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
//   pub val: i32,
//   pub left: Option>>,
//   pub right: Option>>,
// }
//
// 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/ 博客原创~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/941957.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存