二叉树题目:统计二叉树中好结点的数目

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:统计二叉树中好结点的数目

出处:1448. 统计二叉树中好结点的数目

难度

5 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root,如果从根结点到结点 X 的路径上没有任何结点的值大于 X 的值,则结点 X 是好结点。

返回二叉树中好结点的数目。

示例

示例 1:

示例 1

输入: root = [3,1,4,3,null,1,5] \texttt{root = [3,1,4,3,null,1,5]} root = [3,1,4,3,null,1,5]
输出: 4 \texttt{4} 4
解释:图中蓝色结点是好结点。
根结点 (3) \texttt{(3)} (3) 总是好结点。
结点 4 → (3,4) \texttt{4} \rightarrow \texttt{(3,4)} 4(3,4) 是路径中的最大值。
结点 5 → (3,4,5) \texttt{5} \rightarrow \texttt{(3,4,5)} 5(3,4,5) 是路径中的最大值。
结点 3 → (3,1,3) \texttt{3} \rightarrow \texttt{(3,1,3)} 3(3,1,3) 是路径中的最大值。

示例 2:

示例 2

输入: root = [3,3,null,4,2] \texttt{root = [3,3,null,4,2]} root = [3,3,null,4,2]
输出: 3 \texttt{3} 3
解释:结点 2 → (3, 3, 2) \texttt{2} \rightarrow \texttt{(3, 3, 2)} 2(3, 3, 2) 不是好结点,因为 3 \texttt{3} 3 比它大。

示例 3:

输入: root = [1] \texttt{root = [1]} root = [1]
输出: 1 \texttt{1} 1
解释:根结点是好结点。

数据范围

  • 树中结点数目在范围 [1, 10 5 ] \texttt{[1, 10}^\texttt{5}\texttt{]} [1, 105]
  • -10 4 ≤ Node.val ≤ 10 4 \texttt{-10}^\texttt{4} \le \texttt{Node.val} \le \texttt{10}^\texttt{4} -104Node.val104

解法一

思路和算法

二叉树中的每个结点对应一条从根结点到该结点的路径。如果一个结点是好结点,则从根结点到该结点的路径上的每个结点值都不超过该结点值,即路径上的最大结点值不超过该结点值。

可以使用深度优先搜索判断二叉树中的每个结点是否是好结点。从根结点开始遍历全部结点,由于同一条路径上的结点的遍历顺序是从上到下,在访问到一个结点时,该结点的所有祖先结点都已经被访问过,因此可以得到从根结点到该结点的路径上的最大结点值。由于当前结点也在路径上,因此路径上的最大结点值一定不会小于当前结点值,如果当前结点值等于路径上的最大结点值,则当前结点是好结点。

在访问一个结点之后,对于其非空子结点,更新从根结点到子结点的路径上的最大结点值,对子结点继续遍历。

遍历结束之后,即可得到二叉树中好结点的数目。

代码

class Solution {int count = 0;public int goodNodes(TreeNode root) {dfs(root, root.val);return count;}public void dfs(TreeNode node, int maxValue) {if (node.val == maxValue) {count++;}TreeNode left = node.left, right = node.right;if (left != null) {int leftMaxValue = Math.max(left.val, maxValue);dfs(left, leftMaxValue);}if (right != null) {int rightMaxValue = Math.max(right.val, maxValue);dfs(right, rightMaxValue);}}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

也可以使用广度优先搜索判断二叉树中的每个结点是否是好结点。从根结点开始遍历全部结点,访问结点的顺序为层数递增的顺序,遍历过程中,对于每个结点,得到该结点对应的从根结点到该结点的路径上的最大结点值,判断该结点是否是好结点。

为了记录每个结点对应的从根结点到该结点的路径上的最大结点值,需要使用两个队列,分别存储结点和路径上的最大结点值,这两个队列分别为结点队列和最大值队列,初始时将根结点和根结点值分别入结点队列和最大值队列。每次将一个结点和一个最大值分别从结点队列和最大值队列出队列,如果当前结点值等于路径上的最大结点值,则将好结点的数目加 1 1 1。对于当前结点的非空子结点,计算从根结点到子结点的路径上的最大结点值,然后将子结点和子结点对应的最大结点值分别入结点队列和最大值队列。

遍历结束之后,即可得到二叉树中好结点的数目。

代码

class Solution {public int goodNodes(TreeNode root) {int count = 0;Queue<TreeNode> nodeQueue = new ArrayDeque<TreeNode>();Queue<Integer> maxNode = new ArrayDeque<Integer>();nodeQueue.offer(root);maxNode.offer(root.val);while (!nodeQueue.isEmpty()) {TreeNode node = nodeQueue.poll();int maxValue = maxNode.poll();if (node.val == maxValue) {count++;}TreeNode left = node.left, right = node.right;if (left != null) {nodeQueue.offer(left);maxNode.offer(Math.max(left.val, maxValue));}if (right != null) {nodeQueue.offer(right);maxNode.offer(Math.max(right.val, maxValue));}}return count;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/144477.shtml

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

相关文章

IEEE Standard for SystemVerilog—Chapter14. Clocking blocks

14.1 General This clause describes the following: — Clocking block declarations(时钟块声明) — Input and output skews(输入和输出偏斜) — Clocking block signal events(时钟块信号事件) — Cycle delays(周期延迟) — Synchronous events(同步事件) — Synchronous…

Ubuntu22.04离线安装uwsgi问题记录

GCC4.8安装 1、报错信息1&#xff1a; 由于缺少gcc4.8环境导致的无法安装uwsgi 解决方案&#xff1a; 离线安装GCC4.8环境, GCC4.8.5离线安装步骤如下&#xff1a; 1、下载gcc的离线安装包及其依赖包&#xff0c;链接如下&#xff1a; https://download.csdn.net/download/…

idea运行项目之后一直卡在Writing classes… 解决方案

最近遇到idea里直接运行一个Spring boot项目后&#xff0c;idea一直慢悠悠的parsing java&#xff0c;然后就writing classes&#xff0c;然后就一直卡着不动了&#xff0c;运气好10几分钟能把项目启动起来。 多年的摸鱼经验告诉我&#xff0c;事出反常必有妖&#xff0c;赶紧…

35、Flink 的 Formats 之CSV 和 JSON Format

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

使用.net 构建 Elsa Workflow

对接过蓝凌OA 也基于泛微OA数据库原型重新研发上线过产品&#xff0c;自研的开源的也上线过 每个公司对OA流程引擎介绍 都不一样的&#xff0c; 比如Elsa 这款微软MVP开源组件&#xff0c;基于跨平台开发的技术含量高&#xff0c;专门做OA的同行推过对应文章。 直接看怎么用吧。…

新版本!飞凌嵌入式RK3568系列开发板全面支持Debian 11系统

飞凌嵌入式OK3568-C/OK3568J-C开发板现已全面支持Debian 11系统&#xff0c;新系统的加持能为用户提供主控新选择&#xff0c;并为开发者带来更多开发便利&#xff01; Debian系统作为一种广受欢迎和信赖的开源操作系统&#xff0c;以其稳定性、可靠性和开放性而闻名&#xff0…

MySQL(16):变量、流程控制与游标

变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为 系统变量 以及 用户自定义变量 。 系统变量 变量由系统定义&#xff0c;不是用户定义&#xff…

centos搭建docker镜像Harbor仓库的简明方法

在kubernetes集群中如果要部署springcloud这样的应用&#xff0c;就必须有一个自建的docker镜像中心仓库。 它的目的有两点&#xff1a; 1. 镜像拉取速度快 2. 开发好维护 而Harbor是一个非常好用的docker本地仓库 所以本篇文章来讲讲如何在部署Harbor仓库 首先系统版本最…

前端实现RSA非对称加密及生成RSA公私密钥

前端实现RSA非对称加密 RSA简介安装jsencryptRSA加密RSA解密如何生成公私秘钥&#xff08;windows&#xff09; RSA简介 RSA用于保密性时&#xff0c;就是公钥加密&#xff0c;私钥解密。 因为公钥是可以公开了&#xff0c; 那么任何人都可以使用公钥对信息进行加密&#xff0…

npm封装插件打包上传后图片资源错误

问题&#xff1a; npm封装插件&#xff1a;封装的组件页面涉及使用图片资源&#xff0c;在封装的项目里调用图片显示正常&#xff1b;但是打包上传后&#xff0c;其他项目引入使用报错找不到图片资源&#xff1b;图片路径也不对 获取图片的base64方法 解决方案&#xff1a; 将…

一个合格的软件测试工程师该如何提升自己

作为一名软件测试工程师&#xff0c;如何提升自己的核心竞争力&#xff1f;如何提高自己的专业水平&#xff1f; 一、持续挑战自我 没有挑战&#xff0c;便不会进步。每月给自己一个小目标&#xff0c;每季度一个大目标&#xff1b;比如&#xff0c;从纯手工测试到专项测试的转…

新手小白看过来——带你快速入门跨境电商

近几年来&#xff0c;国内外贸交易是越来越火爆&#xff0c;其中跨境电商成为了2023年的热门风口行业&#xff0c;尽管现在做跨境电商的从业者有很多&#xff0c;但仍然有许多0基础小白想通过跨境电商获取人生的第一桶金&#xff0c;那么新手应该如何在跨境电商领域取得成功呢&…

【博客系统】 一

该博客系统基于servlet和mysql数据库 , 并且通过xshell终端工具部署至云服务器. 实现的功能包括: 1.博客列表页 2.博客详情页 3.登陆页面 4.强制登陆检查 5.获取用户信息 6.退出登陆 7.发布博客 一.系统展示 登陆页面 博客列表页 博客详情页 博客编辑页 下面就开始编写代码了.…

react+video.js h5自定义视频暂停图标

目录 参考网址 效果图&#xff0c;暂停时显示暂停图标&#xff0c;播放时隐藏暂停图标 代码说明&#xff0c;代码传入url后&#xff0c;可直接复制使用 VideoPausedIcon.ts 组件 VideoCom.tsx Video.module.less 参考网址 在Video.js播放器中定制自己的组件 - acgtofe 效…

域控操作四:本地化统一壁纸切可随时更改

分两步 1&#xff0c;将壁纸发送到本地&#xff0c;2指向本地地址路径 将壁纸发送到本地 用户配置–首选项–Windows设置–文件 按图进行更改就可以将共享文件夹的图片发送到员工电脑上 2将壁纸指向刚刚设置的目的文件 用户配置–策略–管理模板–桌面–桌面 按图进行设置即…

使用UART烧录N76E003AT20核心板

目录 模块简介烧录方式利用ISP对N76E003AT20核心板进行烧录ICP烧录BootloaderISP烧录程序&#xff08;UART&#xff09;测试现象 总结 模块简介 N76E003为带有flash的增强型8位8051内核微控制器&#xff08;1T工作模式&#xff09;&#xff0c;指令集与标准的80C51完全兼容并具…

RDB是什么?·

目录 一、RDB是什么&#xff1f; 二、 RDB触发机制 2.1 手动触发 2.2 自动触发 2.3 RDB执行流程 三、RDB的文件处理 四、RDB的优缺点 一、RDB是什么&#xff1f; RDB是Redis DataBase&#xff0c;是Redis实现数据持久化的一种方式。因为Redis的数据是存储在内存中的&#xff0…

Misc | bucket 第二届“奇安信”杯网络安全技能竞赛

题目描述&#xff1a; 解密Base全家桶。 密文&#xff1a; 下载附件&#xff0c;解压得到一个txt文本&#xff0c;打开如下。 3441344134363435344435323442344534423441343635353334353333323442343935413442353434393535354135333441344534353536353535333332353534413436…

Karmada更高效地实现故障转移

随着云原生技术的发展&#xff0c;其应用场景不断扩大。越来越多的企业开始将应用程序部署在 Kubernetes 集群中&#xff0c;随着 Kubernetes 集群规模的不断扩大&#xff0c;也带来了许多管理挑战&#xff0c;例如多集群间负载均衡、资源调度、故障转移等问题。为了解决这些问…

超详细的Jmeter随机参数各种搭配

前言 参数配置应该有三种场景&#xff0c;具体其他的我还没想到&#xff0c;那到底是哪三种呢&#xff1f;如果你也对这个问题感兴趣的话&#xff0c;那就让我们一起往下看吧&#xff01; 一、两个固定值之间随机生成一个值&#xff0c;应用场景没有限制 1、最简单的两个值之…