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

news2024/11/29 0:38:01

文章目录

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

题目

标题和出处

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

出处: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.coloradmin.cn/o/1216020.html

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

相关文章

网络编程TCP/UDP

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 clie…

CodeMeter软件保护及授权管理解决方案(一)

概述 CodeMeter是德国威步&#xff08;Wibu-Systems AG&#xff09;2004年1月推出的软件加密及授权管理综合解决方案&#xff0c;用于软件保护实现防盗版、软件授权管理实现软件货币化、以及数据加密实现数字资产保护。 使用CodeMeter综合解决方案&#xff0c;可以实现以下价…

Java中的Maven项目使依赖和自己写的代码的分开的部署的部署方式

文章目录 优点maven中配置执行maven 打包项目部署查看服务启动状态 优点 随着项目的功能越来越多&#xff0c;如果把所有代码都打包到一个jar里&#xff0c;这样不利于传输。把源码和依赖包分开。这样如果依赖包没有变化的话&#xff0c;再此部署时&#xff0c;就不需要往服务…

C++之使用std::move与否实例区别(二百五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

香港优才计划获批概率跌破20%,拿香港身份越来越难了?

香港优才计划获批概率跌破20%&#xff0c;拿香港身份越来越难了&#xff1f; 截止10月31日&#xff0c;香港各类人才引进计划共收到18万4538宗申请&#xff0c;获批11万5741宗&#xff0c;整体“获批率”为62.72%。 具体到项目获批率&#xff1a; ①优才计划共收到63979宗申请&…

最终方案(乱)

为什么要在mos管上并一个快恢复二极管 因为电机成感性&#xff0c;为了在关断期间给它提供一个续流回路

单片机编程原则

多任务编程的概念 方式一&#xff1a;实时操作系统&#xff08;不建议新手使用&#xff09; 方式二 &#xff1a;裸机多任务模型 逻辑多任务的基本原理 把三个任务分别分为一个一个的片段 然后先执行任务一的第一个切片 执行第二个任务的第一个片段 执行第三个任务的第一个片…

SystemC 学习之与 Verilog 的混合仿真(十)

1、SC 与 Verilog 的通信方式 Systemc 和 verilog 通信方式有两种&#xff0c;一种是 PLI&#xff0c;但是 PLI 只能 verilog 调用 c/c&#xff0c;不能从 c/c 直接调用 verilog&#xff0c;想要从 c/c 调用 verilog 的话&#xff0c;需要先用 verilog 调用 c/c 函数&#xff…

企业邮箱认证指南:安全与高效的邮箱认证方法

企业邮箱是专门为企业提供的电子邮件服务&#xff0c;安全性和专业性更高。在开始使用企业邮箱之前&#xff0c;很多人会有一些问题&#xff0c;比如企业邮箱需要认证吗、如何开通企业邮箱&#xff0c;以及哪款企业邮箱好。 1、企业邮箱在使用前需要认证吗&#xff1f; 答案是肯…

div中的两个元素怎么实现上下排列

案例: 这里面的分享活动页和获取抽奖机会两个文字上下排列怎么实现? 答案: 父元素加上两个属性: display: flex; flex-direction: column; 就实现了

分布式下多节点WebSocket消息收发

1、使用场景 2、疑问 第一次发送请求后&#xff0c;通过N1&#xff0c;W2&#xff0c;到达service2&#xff0c;建立websocket连接。 1、接下来发送的消息&#xff0c;通过Ngixn后和网关gateway后还能落在service2上面吗&#xff1f; 如果不能落在service2上&#xff0c;需要怎…

【发表案例】IF6.5+,中科院2区,2个月录用,6天见刊!

计算机类SCIE 【期刊简介】IF&#xff1a;6.5-7.0&#xff0c;JCR1区&#xff0c;中科院2区 【检索情况】SCIE 在检&#xff0c;正刊 【征稿领域】数据表示、存储和处理、交换和访问、数据丢失处理等机器学习相关研究&#xff1b;云到物的连续体&#xff1b;数据结构架构&am…

ClickHouse联合创始人、前Google副总裁Yury到访杭州玖章算术公司,双方建立生态合作

10月31日&#xff0c;ClickHouse联合创始人Yury到访未来科技城&#xff0c;与玖章算术创始人叶正盛和国际总经理Ni Demai展开沟通与推进合作。 图片备注&#xff1a;Ni Demai(左),Yury(中),叶正盛(右) ClickHouse是深受开发者青睐的实时分析型数据库&#xff0c;成立2年就发展成…

微信加好友操作频繁了,怎么办?

近来&#xff0c;微信的风控是越来越严重&#xff0c;因为本身微信是作为一个社交软件&#xff0c;但流量大适合用来做私域营销。在日常使用微信中&#xff0c;我们也要了解下微信加好友的规则。 目前微信加人的规则是&#xff1a; 1、通过附近人功能加人上限15人/天&#xf…

制作企业期刊的必备工具,这个很强!

制作企业期刊是一项重要的任务&#xff0c;它不仅可以帮助企业展示自己的品牌形象&#xff0c;还可以促进内部员工的交流和合作。为了制作出一份高质量的企业期刊&#xff0c;你需要一些必备的工具。今天&#xff0c;给大家分享一款实用的工具-------FLBOOK在线制作电子杂志平台…

MS90C385B——+3.3V 150MHz 的 24bit 平板显示器(FPD) LVDS 信号发送器

MS90C385B 芯片能够将 28bit 的 TTL 数据转换成 4 通道的低压差分 信号 (LVDS) 。时钟通道经过锁相之后&#xff0c;与数据通道并行输出。当时钟频 率为 150MHz 时&#xff0c; 24bit 的 RGB 数据、 3bit 的 LCD 时序数据和 1bit 的控 制数据以 1050Mbps…

GLSL: Shader cannot be patched for instancing.

最近在 unity 里碰到了这么一个错误&#xff0c;只有这么点信息&#xff0c;让人看着挺懵逼的&#xff0c;后来发现&#xff0c;是因为 unity 的 terrain 组件在设置里勾了 Draw Instanced 选项导致的&#xff0c;感觉应该是 unity 的 bug。 因为错出在 2021&#xff0c;2022就…

11月编程榜最新出炉,第一名很离谱

这段时间&#xff0c;随着人工智能的崛起&#xff0c;Python的地位水涨船高。有不少朋友感觉到危机重重。 其中&#xff0c;最明显的&#xff0c;是市场环境的变化&#xff1a; 外部招聘&#xff1a;Python岗位日均需求量高达15000&#xff01;不仅是程序员&#xff0c;内容编…

Java 集合框架,泛型,包装类

文章目录 集合框架泛型Java 中的泛型裸类型&#xff08;了解&#xff09;原理泛型的上界泛型方法通配符 包装类ArrayList构造常见操作 LinkedListStackQueuePriorityQueueMapMap.Entry<K, V>Map 常用方法 Set常用方法 集合框架 Vector 一个古老的集合类&#xff0c;实现了…

【EI会议征稿】第四届机械设计与仿真国际学术会议(MDS 2024)

【高录用快检索】第四届机械设计与仿真国际学术会议&#xff08;MDS 2024) 2024 4th International Conference on Mechanical Design and Simulation 2024年第四届机械设计与仿真国际学术会议&#xff08;MDS 2024) 将于2024年03月01-03日在中国西安召开。MDS 2024将围绕“…