IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【算法leetcode每日一练】2265. 统计值等于子树平均值的节点数 -> 正文阅读

[数据结构与算法]【算法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 := []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<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/ 博客原创~


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:54:13  更:2022-05-18 17:54:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 6:20:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码