leetcode1448.统计二叉树中的好节点数目

news/2025/2/12 2:32:21/

1. 题目描述

题目链接
在这里插入图片描述在这里插入图片描述

2. 解题思路

首先看一下题目的“核心”,什么是好节点:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。也就是说,我们只要知道了从根节点到该节点的所有的值,就可以判断该节点是不是好节点了。从根节点到x节点,很容易想到先序遍历(深度优先),先序遍历访问的顺序恰好是根节点到该节点的路径顺序,我们可以在递归遍历的过程中记录路径上的最大值,然后比较当前节点的值和路径上的最大值来确定是否为好节点。

如果当前节点的值大于或等于路径上的最大值,则将其计为好节点,并更新路径上的最大值;
否则,我们不将其计为好节点。

再递归遍历左、右子树时,我们分别传递更新后的路径上的最大值,这样可以确保路径上的最大值的更新在递归遍历中被正确传递和更新。

3. 代码

public class GoodNodes {/*给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。*/private int goodCount = 0; // 将好节点计数设置为类的成员变量public int goodNodes(TreeNode root) {countGoodNodes(root, Integer.MIN_VALUE); // 从根节点开始计算好节点return goodCount; // 返回累计的好节点数量}private void countGoodNodes(TreeNode node, int maxSoFar) {if (node == null) return; // 如果当前节点为空,则返回if (node.val >= maxSoFar) { // 如果当前节点的值大于或等于路径上的最大值goodCount++; // 将当前节点计为好节点maxSoFar = node.val; // 更新路径上的最大值为当前节点的值}// 递归遍历左子树和右子树,分别传递更新后的路径上的最大值countGoodNodes(node.left, maxSoFar);countGoodNodes(node.right, maxSoFar);}/*由于先序遍历访问的顺序恰好是根节点到该节点的路径顺序,我们可以在递归遍历的过程中记录路径上的最大值,然后比较当前节点的值和路径上的最大值来确定是否为好节点。如果当前节点的值大于或等于路径上的最大值,则将其计为好节点,并更新路径上的最大值;否则,我们不将其计为好节点。在递归遍历左右子树时,我们分别传递更新后的路径上的最大值,这样可以确保路径上的最大值的更新在递归遍历中被正确传递和更新。因此,通过修改先序遍历的代码来记录路径上的最大值,并比较节点的值和路径上的最大值,我们可以计算出好节点的数量。* */
}

在这里插入图片描述


http://www.ppmy.cn/news/1421005.html

相关文章

DC-5渗透测试复现

DC-5渗透测试复现 目的: 获取最高权限以及5个flag 过程: 信息打点-文件包含漏洞-弹shell- scren-4.0.5提权 环境: 攻击机:kali(192.168.85.136) 靶机:DC_3(192.168.85.134) 复现: 一.信息收集 nma…

vim中函数跳转的功能实现

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。 公众号:一点sir,关注领取编程资料 介绍 函数跳转是要给IDE中非常重要也非常常用的功能,而原生的 Vim 并不提供这个功能&…

【C语言】带你完全理解指针(五)练习

复习一下对数组名的理解 数组名的理解 数组名是数组首元素的地址 但是有2个例外: 1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节 2. &数组名,这里的数组名表示整个数组&#xff…

(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(继承和类型兼容性)

8.4.2 延迟绑定和多态性 ​ Object Pascal 函数和过程通常基于静态绑定,也称为早期绑定。这意味着方法调用是在编译或链接时解决的。面向对象编程语言允许延迟绑定或动态绑定,即根据用于调用的实例类型在运行时确定要调用的方法。 ​ 这种技术的优势被…

JVM结构化体系

目录 目录 1.JVM 简介 1.1. 如何理解 JVM 呢? 1.2. 市场主流 JVM 分析? 1.3. 为什么要学习 JVM? 1.4. 字节码底层是如何执行呢? 如何理解 JIT 呢? 为什么 JVM 中解释执行与编译执行的并存(混合模式&…

Unity构建详解(8)——SBP的Bundle生成

【WriteSerializedFiles】 这里将实际的写操作执行单独拎了出来共用,放在了IRunCachedCallbacks,但数据的传入和处理还是在Task中执行。 这一步会生成实际的SerializedFile文件,文件名就是之前的InternalName,但这还不是最终的B…

设计模式(019)行为型之状态模式

状态模式是一种行为型设计模式,它允许对象在内部状态发生变化时改变它的行为,使得对象在不同状态下有不同的行为表现,而且可以方便地添加新的状态而不必修改已有的代码。 1、场景设计 实现场景:对状态A和状态B做出不同的处理。 …