1448. 统计二叉树中好节点的数目(C++题解)

news2024/11/20 15:22:44

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

给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。

「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。

示例 1:

在这里插入图片描述
输入:root = [3,1,4,3,null,1,5]
输出:4
解释:图中蓝色节点为好节点。
根节点 (3) 永远是个好节点。
节点 4 -> (3,4) 是路径中的最大值。
节点 5 -> (3,4,5) 是路径中的最大值。
节点 3 -> (3,1,3) 是路径中的最大值。

示例 2:

请添加图片描述
输入:root = [3,3,null,4,2]
输出:3
解释:节点 2 -> (3, 3, 2) 不是好节点,因为 “3” 比它大。

示例 3:

输入:root = [1]
输出:1
解释:根节点是好节点。

提示:
二叉树中节点数目范围是 [1, 10^5] 。
每个节点权值的范围是 [-10^4, 10^4] 。

思路

看到这题最初的算法思路就是遍历,通过遍历的时候计算满足的节点个数。满足的节点都有一个共性,就是是当前节点路径中的最大节点,所有就需要在遍历的时候,来判断当前节点之前的路径上面有没有大于当前节点的,如果有,说明当前节点不满足,否则满足。

解题方法

按照深度搜索的思想,每次先访问左节点再访问右节点。其中当前节点如果大于左孩子节点的话,就说明左节点肯定不满足要求了,因为不是最大的了,所以把当前节点的值赋给左孩子节点的值,这样就保证了最大节点的值每次都会保存在当前节点上,只需要跟左右节点进行判断就行。如果当前节点小于左孩子节点,说明左孩子节点满足要求,则count+1,在递归的时候就是直接递归左孩子节点就行了。右节点也是同样的思路。

复杂度

时间复杂度:
O(n)

空间复杂度:
O(n)

Code(C++)

 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int count=1 ;
    int goodNodes(TreeNode* root) {
        //按照递归的思想,每次按照左右孩子节点和根节点来判断,之后左右节点按大小与根节点中大的值传入
        if(root->left!=NULL){
            if(root->val>root->left->val){//左孩子不满足的时候
                root->left->val=root->val;
                goodNodes(root->left);
            }
            else{
                count++;
                goodNodes(root->left);
            }            
        }
        if(root->right!=NULL){
            if(root->val>root->right->val){//右孩子不满足的时候
                root->right->val=root->val;
                goodNodes(root->right);
            }
            else{
                count++;
                goodNodes(root->right);
            }
        }
        return count;
   }
};

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

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

相关文章

门店数字化系统怎么做?

​如果门店只做线下生意,相信前几年的经历已经充分说明一旦客户不上门、生意就玩完;如果门店只做线上生意,无数平台的血泪教训也表明哪怕砸钱也无法跟大平台抗衡;因此,线上线下深度融合已经成为实体行业的必然趋势&…

解决 ‘bee‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

最近在学习go 中的beego框架,在下载依赖 之后执行bee new projectname 后出现了一个问题: 网上教程说是缺少环境变量,又说什么需要自己收到beego的src文件夹下编译main.go 忙活了半天,最后都以失败告终; 解决方案是: go install github.com/beego/bee/v2master执行bee ve…

【2023全网最全最火教程】WebSocket协议测试实战

当涉及到WebSocket协议测试时,有几个关键方面需要考虑。在本文中,我们将探讨如何使用Python编写WebSocket测试,并使用一些常见的工具和库来简化测试过程。 1、什么是WebSocket协议? WebSocket是一种在客户端和服务器之间提供双向…

爬虫逆向实战(二十一)-- 某某点集登录与获取数据

登录 一、数据接口分析 主页地址:某某点集 1、抓包 通过抓包可以发现登录接口是phonePwdLogin 2、判断是否有加密参数 请求参数是否加密? 通过查看“载荷”模块可以发现有pwd和sig两个加密参数 请求头是否加密? 无响应是否加密&#x…

Java并发工具类

JDK并发包中常用并发工具类: CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段; Exchanger工具类则提供了在线程间交换数据的一种手段。 等待多线程完成的CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成…

LTK5313功放芯片

LTK5313 是一款内置自适应升压F类音频功率放大芯片,具有AGC防破音功能、AB/D类模式切换、自适应、超低底噪、超低EMI。自适应升压在输出幅度较小时升压电路不工作,功放直接由电源供电,当输出较大时内部自动启动升压电路,功放供电…

每天一道leetcode:542. 01 矩阵(图论中等广度优先遍历)

今日份题目: 给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例1 输入:mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff…

如何从“监控”到“可观测性”?

什么是可观测性? 可观测性(Observability)是一种通过系统产生的输出数据(如日志、指标和链路追踪)来衡量当前系统运行状态的能力,其源于现代应用系统的复杂性和分布式架构,这些应用系统往往由大…

VUE之jspreadsheet电子excel表格动态高度设置

问题:excel电子表格在不同屏幕大小下横向滚动条会被遮挡 排查原因:由于excel高度固定导致 解决方法:设计页面较多,所以封装公共方法 步骤: 1.使用混入封装动态设置excel高度方法: const mixinJexcel …

达梦数据库分区表介绍

概述 本文将对达梦数据库分区表概念、创建、维护进行介绍。 1.分区表概念 1.1 分区表使用场景 近几年,随着移动支付快速发展,银行交易系统中【移动小微支付场景】使用越来越多,系统中流水账单表数据量巨大,往往上TB。 为了提高…

java八股文面试[JVM]——双亲委派模型

1.当AppClassLoader去加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父加载器ExtClassLoader去完成。 2.当ExtClassLoader去加载一个class时,它首先也不会去尝试加载这个类,而是把类加载请求委托给父加载…

【esp32】GPIO引脚功能使用集合

本文主要介绍 esp32 这块芯片的GPIO 口功能使用以及软硬件设计注意事项 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页:欢迎访问我的 Ethernet_Comm 博客主页…

uniapp 安卓平台签名证书(.keystore)生成

安装JRE环境 下载jre安装包:https://www.oracle.com/java/technologies/downloads/#java8安装jre安装包时,记录安装目录(例:C:\Program Files\Java\jdk-20)打开命令行(cmd),将JRE安装路径添加到系统环境变量 d: se…

Linux操作系统--linux环境搭建(3)

在上一小节中,我们搭建好了虚拟机,那么接下来,我们在虚拟机上安装我们的Linux操作系统。 1.CentOS安装 下面我们开始在我们创建好的虚拟机上安装CentOS操作系统。流程如下所示: (1).Vmware要求如果需要启动一台虚拟机,需要确保你的电脑主机必须要支持虚拟化的技术。如何…

SLS筛选推送链

* | select "client_ip", "url", count(*) as "number" from log group by "client_ip", "url" order by "number" desc

记录一次presto sql执行报错 Error executing query的解决办法

在执行presto sql 时报错截图如下: 查看后台执行报错日志: java.sql.SQLException: Error executing query at com.facebook.presto.jdbc.PrestoStatement.internalExecute(PrestoStatement.java:307) at com.facebook.presto.jdbc.PrestoStatement.exe…

Alibaba Nacos Authentication Bypass Vulnerability

文章目录 Nacos 提供了四大功能服务发现和服务健康检查动态配置管理动态域名解析服务服务和元数据管理 Alibaba Nacos Authentication Bypass Vulnerability Alibaba Nacos(Dynamic Naming and Configuration Service)是由阿里巴巴公司维护的一款开源项目,易于构建云…

centos7设置静态IP地址

安装完成系统后,接下来就是配置静态IP地址,如下: 进入编辑模式vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件名不一定是ifcfg-ens33,到/etc/sysconfig/network-scripts下面找下是哪个文件 修改 : BOOTPROTO…

Ansible 创建逻辑卷

创建一个名为/ansible/lv.yml 的 playbook ,它在所有受管节点上运行以执行下列任务: 创建符合以下要求的逻辑卷: 逻辑卷创建在 research 卷组中 逻辑卷名称为 data 逻辑卷大小为 1500 MiB 使用 ext4 文件系统格式化逻辑卷 如果无法创建请求的…

keepalived + lvs (DR)

目录 一、概念 二、实验流程命令 三、实验的目的 四、实验步骤 一、概念 Keepalived和LVS(Linux Virtual Server)可以结合使用来实现双机热备和负载均衡。 Keepalived负责监控主备服务器的可用性,并在主服务器发生故障时,将…