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

文章目录

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

题目

标题和出处

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

出处: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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI编程助手】Devchat解析:深入了解、快速配置与实际应用

AI编程助手已经成为现代软件开发的重要工具之一。本文将深入探讨Devchat这一AI编程助手&#xff0c;包括其工作原理、快速配置以及实际应用案例。了解Devchat&#xff0c;将使开发人员更高效地编写和优化代码&#xff0c;提升软件开发过程的质量和速度。 引言 人工智能的迅速发…

【LeetCode刷题-滑动窗口】--159.至多包含两个不同字符的最长子串

159.至多包含两个不同字符的最长子串 方法&#xff1a;滑动窗口 定义两个指针left和right作为窗口的边界&#xff0c;将两个指针都设定在位置0&#xff0c;然后向右移动right指针&#xff0c;直到窗口内不超过两个不同的字符&#xff0c;如果某一点我们得到了3个不同的字符&am…

中文撰稿好用软件推荐TexPage(似于Overleaf)

由于本人用惯了overleaf所以找到了一个与他功相似的也同样是利用tex写文章。唯一的区别可能也就是overleaf只支持英文&#xff0c;而TexPage中英文都支持。关键是不花钱&#xff0c;好用好用好用&#xff0c;用起来&#xff01; 平台网址&#xff1a;https://www.texpage.com/…

git撤销未git commit的文件

目录 一、问题描述 二、方式1&#xff1a;git命令撤销&#xff08;更专业&#xff09; 1、文件已git add&#xff0c;未git commit 2、本地修改&#xff0c;未git add &#xff08;1&#xff09;撤销处于unstage的文件&#xff0c;即删除已有变动 &#xff08;2&#xff…

全套完整版实战型Java云HIS系统源码

一、云HIS系统框架简介 1、技术框架 &#xff08;1&#xff09;总体框架&#xff1a; SaaS应用&#xff0c;全浏览器访问 前后端分离&#xff0c;多服务协同 服务可拆分&#xff0c;功能易扩展 &#xff08;2&#xff09;技术细节&#xff1a; 前端&#xff1a;AngularN…

H3C交换机IRF2堆叠配置方法

文章目录 一、IRF配置需求说明二、IRF配置步骤2.1 配置设备编号2.2 配置堆叠口2.3 BFD分裂检测&#xff08;选配&#xff09; 关键配置说明推荐阅读 一、IRF配置需求说明 由于网络规模迅速扩大&#xff0c;当前中心交换机&#xff08;Device A&#xff09;转发能力已经不能满足…

缺陷预测(一)——论文复现(pipeline)

运行pipeline文件 出现的问题&#xff1a;找不到路径原因&#xff1a;结果 出现新问题&#xff1a;2023年11月14日22:12:22 出现的问题 出现的问题&#xff1a;找不到路径 FileNotFoundError: [Errno 2] No such file or directory:./downstream_task/data/results/within_p…

数据加解密系统(揭秘数据解密的关键技术)

数据加解密系统是一种用于保护数据安全的系统&#xff0c;它可以将数据加密以防止未经授权的访问和数据泄露&#xff0c;同时也可以将已加密的数据解密以供授权用户使用。 随着网络技术和电子商务的不断发展&#xff0c;数据安全问题越来越受到人们的关注。数据加解密系统被广泛…

猫罐头哪个牌子好?推荐5款猫罐头品牌排行榜!

选择猫罐头是一项非常重要的任务&#xff0c;绝对不能马虎对待。因为好的猫罐头不仅提供丰富的营养&#xff0c;充足的水分和良好的口感&#xff0c;还能被猫咪轻松吸收。然而&#xff0c;一旦选择错误&#xff0c;不仅无法达到这些效果&#xff0c;还可能产生相反的影响。 作为…

【Android】设置全局标题栏

序言 在做项目的时候&#xff0c;有时候需要一个全局统一的标题栏&#xff0c;保证项目风格的统一&#xff0c;但是如果在每个activity上面都写一遍这个标题栏就很麻烦了&#xff0c;我们经常用的方法就是写个基类Activity&#xff0c;然后当某个Activity需要这个统一的标题栏…

ubuntu中/etc/rc.local和/etc/init.d/rc.local的区别是什么

在早期版本的Ubuntu中&#xff0c;通常会使用 /etc/rc.local 或 /etc/init.d/rc.local 文件执行在系统启动时需要运行的自定义脚本或命令。然而&#xff0c;随着Ubuntu的版本升级&#xff0c;这两者的使用方式有了一些变化。 /etc/rc.local&#xff1a; 功能&#xff1a; /etc/…

ATFX汇市:英国通胀率大降两个百分点,GBPUSD止步近两月高点

ATFX汇市&#xff1a;据英国国家统计局数据&#xff0c;英国10月CPI年率最新值4.6%&#xff0c;远低于前值6.7%&#xff0c;低于预期值4.8%&#xff0c;英国通胀率大降温&#xff0c;降幅高达2.1个百分点&#xff0c;远远超出市场预期。4.6%的通胀率是2021年10月以来最低值。主…

基于Vue+SpringBoot的高校大学生创业管理系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

Java 12 及Tomcat 部署配置

使用的软件版本 1. Java12部署 和之前的Java版本不太一样&#xff0c;12版本不用配置JRE环境。 解压缩文件夹 root账户执行 tar -xzvf /home/software/jdk-12.0.2_linux-x64_bin.tar.gz创建java文件夹 root账户执行 cd /usr mkdir java移动Java文件到创建的文件夹下 root账…

在计算机领域如神一般存在的人都有哪些?

✍️作者简介&#xff1a;沫小北/码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&…

FastJsonAPI

maven项目 pom.xml <dependencies><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.26</version></dependency><dependency><groupId>junit</groupId>&l…

OpenCV入门5——OpenCV的算术与位运算

文章目录 图像的加法运算图像的减法运算图像的乘除运算图像的融合OpenCV位运算-非操作OpenCV位操作-与运算OpenCV位操作-或与异或为图像添加水印 图像的加法运算 # -*- coding: utf-8 -*- import cv2 import numpy as npimg cv2.imread(E://pic//4.jpg)# 图的加法运算就是矩阵…

11月24日 AI+软件研发数字峰会(AiDD)即将启航!

▼ 伴随着人工智能&#xff08;AI&#xff0c;特别是大语言模型&#xff09;在众多行业领域的广泛应用及其带来的颠覆性变革&#xff0c;软件的开发模式、方式和实践都可能会发生巨大的变化。为助力更多企业在人工智能的浪潮中乘风破浪&#xff0c;“AI软件研发数字峰会&#x…

ssm+vue的OA办公系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的OA办公系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&a…

OpenCV技术应用(3)— 把.png图像保存为.jpg图像

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何把.png图像保存为.jpg图像&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 如果在电脑某…