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

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.hqwc.cn/news/624167.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三个晚上!给干废了!MINI2440 挂载 NFS

虚拟机执行:sudo ifconfig tap0 10.10.10.1 up qemu 开发板: set bootargs noinitrd root/dev/nfs rw nfsroot10.10.10.1:/nfsroot ip10.10.10.10:10.10.10.1 ::255.255.255.0 consolettySAC0,115200 Hit any key to stop autoboot: 0 MINI2440 # set…

P5730 【深基5.例10】显示屏

思路&#xff1a; 此题只需要两层循环&#xff0c;通过数组映射即可求出答案 AC代码&#xff1a; #include<iostream>using namespace std;typedef long long ll; const int N 10; int a[N];int main() {ll n,m;cin >> n >> m;for(ll in;i<m;i){ll nu…

Level protection and deep learning

1.模拟生成的数据 import randomdef generate_data(level, num_samples):if level not in [2, 3, 4]:return Nonedata_list []for _ in range(num_samples):# 构建指定等级的数据data str(level)for _ in range(321):data str(random.randint(0, 9))data_list.append(data)…

自定义类型: 结构体 (详解)

本文索引 一. 结构体类型的声明1. 结构体的声明和初始化2. 结构体的特殊声明3. 结构体的自引用 二. 结构体内存对齐1. 对齐规则2. 为啥存在对齐?3. 修改默认对齐值 三. 结构体传参四. 结构体实现位段1. 什么是位段?2. 位段的内存分配3. 位段的应用4. 位段的注意事项 ​ 前言:…

yolov5 MMCV依赖库 报错(2个错误)

1.报错内容 错误1&#xff1a; ImportError: libtorch_cuda_cu.so: cannot open shared object file: No such file or directory 错误2&#xff1a;ModuleNotFoundError: No module named ‘mmcv._ext’ 2. 原因分析 python 、torch、mmcv版本兼容问题 3.解决方法 首先运行…

linux进阶篇:文件查找的利器——grep命令+管道操作详解

Linux文件查找的利器——grep命令管道操作详解 1 grep简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。 Uni…

BackTrader 中文文档(十八)

原文&#xff1a;www.backtrader.com/ OCO 订单 原文&#xff1a;www.backtrader.com/blog/posts/2017-03-19-oco/oco/ 版本 1.9.34.116 添加了OCO&#xff08;又称一次取消其他&#xff09;到回测工具中。 注意 这只在回测中实现&#xff0c;尚未实现对实时经纪商的实现 注…

2.3 iHRM人力资源 - 路由、左侧菜单栏、处理token失效、退出登录、修改密码

iHRM人力资源 - 处理token失效、退出登录、修改密码 文章目录 iHRM人力资源 - 处理token失效、退出登录、修改密码一、退出登录1.1 处理token失效1.2 调整下拉菜单1.3 退出登录 二、修改密码2.1 弹出层dialog2.2 表单结构2.3 表单校验2.4 表单提交 三、路由3.1 清理多余组件和路…

面试:lock 和 synchronized

一、语法层面 synchronized 是关键字&#xff0c;源码在jvm中&#xff0c;用c语言实现Lock 是接口&#xff0c;源码由jdk提供&#xff0c;用java语言实现使用synchronized时&#xff0c;退出同步代码块锁会自动释放&#xff0c;而使用Lock时&#xff0c;需要手动调用unlock方法…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

Java反序列化基础-类的动态加载

类加载器&双亲委派 什么是类加载器 类加载器是一个负责加载器类的对象&#xff0c;用于实现类加载的过程中的加载这一步。每个Java类都有一个引用指向加载它的ClassLoader。而数组类是由JVM直接生成的&#xff08;数组类没有对应的二进制字节流&#xff09; 类加载器有哪…

基于ubuntu22.04系统安装nvidia A100驱动与NVLink启用

1、官方仓库 针对驱动包下载认准nvidia官网 dpkg -i nvidia-driver-local-repo-ubuntu2204-550.54.15_1.0-1_amd64.deb apt update apt search nvidia-driver-5502、安装 根据步骤1apt search nvidia-driver-550查出版本&#xff1a;此驱动包封在nvidia-driver-local-repo-ub…