热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode6057:计算与子树平均值相等的节点数量——深度优先搜索

本题要求在给定的二叉树中找到所有符合条件的节点数量,即节点的值等于其所有后代节点(包括自身)值的平均值。这里的平均值是通过将所有后代节点值之和除以后代节点的数量,并向下取整得到。
问题描述

给定一个二叉树的根节点 root,请找出并返回那些节点的值等于其子树中所有节点值的平均值的节点数量。

注意事项:

  • 对于 n 个元素,它们的平均值可以通过将这 n 个元素的总和除以 n 得出,且结果应向下取整至最接近的整数。
  • 一个节点的子树包含该节点及其所有的后代节点。

示例 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。

使用 DFS 进行二叉树的后序遍历

采用递归方式执行二叉树的后序遍历,可以有效地计算每个节点子树的总和及节点数,进而判断该节点是否符合题目条件。此方法中,我们通过一个数组来记录每个节点的子树节点总数、子树节点值总和以及满足条件的节点数。递归函数会从叶子节点开始向上返回这些信息,直至根节点,最终得出答案。

/**
* 二叉树节点定义
* 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;
* }
* }
*/
public class Solution {
public int averageOfSubtree(TreeNode root) {
return dfs(root)[2];
}
private int[] dfs(TreeNode node) {
if (node == null) return new int[]{0, 0, 0}; // 基本情况:空节点
int[] leftResult = dfs(node.left);
int[] rightResult = dfs(node.right);
int totalSum = leftResult[0] + rightResult[0] + node.val;
int totalCount = leftResult[1] + rightResult[1] + 1;
int matchingNodes = leftResult[2] + rightResult[2];
if (node.val == totalSum / totalCount) {
return new int[]{totalSum, totalCount, matchingNodes + 1};
} else {
return new int[]{totalSum, totalCount, matchingNodes};
}
}
}


推荐阅读
  • 本文详细介绍了在PHP中如何创建新文件以及如何使自定义函数在整个项目中全局可用的方法,包括最新的实践技巧。 ... [详细]
  • 本文介绍了如何通过自定义View中的declare-styleable属性创建枚举类型,并在代码中访问这些枚举值的方法。 ... [详细]
  • 深入解析Java中的锁类型及其应用场景
    本文详细介绍了Java中常见的锁类型,包括乐观锁与悲观锁、独占锁与共享锁、互斥锁与读写锁、可重入锁、公平锁与非公平锁、分段锁、偏向锁、轻量级锁、重量级锁以及自旋锁。每种锁的特性、作用及适用场景均有所涉及。 ... [详细]
  • 本文探讨了如何在C#应用程序中有效处理来自两个不同数据库的数据,特别是当需要从一个数据库中选择不在另一个大型集合中的ID时遇到的挑战和解决方案。 ... [详细]
  • 基于函数实现的进制转换工具
    本文介绍了一种利用函数实现不同进制数(二进制、八进制、十进制)之间转换的方法。包括了程序的运行效果展示、所使用的主要函数解析、以及如何验证用户输入的合法性。整个项目仅使用了两个全局变量来存储用户的选项和输入的数值。 ... [详细]
  • Java 动态代理详解与示例
    本文详细介绍了Java中的动态代理机制,包括如何定义接口、实现类和代理处理器,并通过具体示例演示了动态代理的创建和使用过程。 ... [详细]
  • 本文详细介绍了如何在Java中实现RSA非对称加密技术,包括生成密钥对、加密和解密操作的具体实现步骤。 ... [详细]
  • CGroups: 资源管理和控制
    CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ... [详细]
  • ArcGIS技巧:为相邻地块创建指定宽度的隔离带
    在地理信息系统(GIS)的数据处理中,为了满足特定项目的质量检查标准,需要在相邻地块之间创建一定宽度的隔离带。本文将探讨如何使用ArcGIS工具解决这一问题,确保不同地块图斑间保持规定的最小距离。 ... [详细]
  • 深度兴趣网络在点击率预测中的应用研究
    本文探讨了一种名为深度兴趣网络(Deep Interest Network, DIN)的新方法,该方法通过捕捉用户的历史行为和当前上下文之间的交互来提高点击率预测的准确性。DIN模型不仅考虑了用户的静态偏好,还动态地调整了对不同商品的兴趣权重,从而实现了更加个性化的推荐。 ... [详细]
  • 本文介绍了如何使用遗传算法来解决加工部件与加工机器之间的最佳匹配问题。研究结果显示,算法具有良好的收敛性能,但在某些情况下可能因样本量不足而导致过早收敛。研究旨在通过遗传算法寻找最优的加工部件分配方案,以最小化加工时间。 ... [详细]
  • 在 PHP 4, PHP 5 和 PHP 7 中,fstat 函数用于获取已打开文件指针的文件统计信息。此函数与 stat() 类似,但其操作对象为已打开的文件指针而非文件名称。 ... [详细]
  • 本文探讨了在PHP中处理特定类型编码字符串的方法,特别是如何将HTML实体编码的字符串转换为普通文本。 ... [详细]
  • 本文深入探讨了@RequestBody注解的使用场景及核心逻辑,包括其与@RequestParam的区别和结合使用的方法。文章前半部分介绍了基础知识,后半部分则详细分析了源码和重要结论。 ... [详细]
  • Python 语言本身并不直接支持数组结构,但可以通过 Python 列表(List)来实现类似的功能。对于需要数组特性的应用,还可以考虑使用 NumPy 库。 ... [详细]
author-avatar
涂凌萱_TLX_9s7_140
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有