学习记录:js算法(五十一):统计二叉树中好节点的数目

news2024/12/28 3:32:30

文章目录

    • 统计二叉树中好节点的数目
      • 网上思路
    • 总结

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

给你一棵根为 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
解释:根节点是好节点。

我的思路
不会。。。
网上思路
递归

网上思路

var goodNodes = function(root) {
    let count = 0;

    function dfs(node, maxVal) {
        if (node === null) return;
        
        if (node.val >= maxVal) {
            count++;
        }
        
        maxVal = Math.max(maxVal, node.val);
        
        dfs(node.left, maxVal);
        dfs(node.right, maxVal);
    }
    
    dfs(root, -Infinity);
    return count;
};

讲解
要计算二叉树中好节点的数量,我们可以使用深度优先搜索(DFS)的方法,递归地遍历树中的每个节点。在遍历过程中,我们需要维护一个从根节点到当前节点的路径上的最大值。如果当前节点的值大于等于这个最大值,那么它就是一个好节点。接下来,我们更新最大值为当前节点的值,然后递归地遍历左右子树。

  1. 初始化:定义一个计数器 count 用于记录好节点的数量,以及一个最大值 maxVal 用于存储从根到当前节点路径上的最大值。
  2. 递归函数:定义一个递归函数 dfs(node, maxVal),它接收当前节点和最大值作为参数。
  3. 基本情况:如果当前节点 node 为空,直接返回。
  4. 更新计数器:如果当前节点的值大于等于 maxVal,则增加 count 计数器,表示找到了一个好节点。
  5. 更新最大值:更新 maxVal 为当前节点的值和 maxVal 中的较大者。
  6. 递归调用:递归地遍历左右子树,将更新后的 maxVal 传入。
  7. 返回结果:在主函数中,调用 dfs(root, -Infinity) 开始遍历,并返回 count

总结

国庆节快乐!

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

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

相关文章

长江存储致态TiPlus7100 4TB满盘读写测试:性能几乎没有下降

一、前言:看看满盘状态下致态TiPlus7100 4TB性能会如何! 现在还有很多同学对于长江存储品牌的存储产品不太信任,在选择SSD时会优先考虑三星、西数这样的品牌。 有鉴于此,我们此次会将手上的长江存储致态TiPlus7100 4TB SSD进行更严…

【STM32单片机_(HAL库)】4-2-1【定时器TIM】定时器输出PWM实现呼吸灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 pwm驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器输出PWM配置步骤main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "pwm.h"int main(void) {HA…

音视频入门基础:FLV专题(10)——Script Tag实例分析

一、引言 在《音视频入门基础:FLV专题(9)——Script Tag简介》中对FLV文件的Script Tag进行了简介。下面用一个具体的例子来对Script Tag进行分析。 二、Script Tag的Tag header实例分析 用notepad打开《音视频入门基础:FLV专题…

鸿蒙跨端实践-JS虚拟机架构实现

作者:京东科技 杜强强 前言 在Roma跨端方案中,JS虚拟机是框架的核心,负责执行动态化的JS代码。在Android平台采用了基于V8的J2V8,iOS平台则使用了系统自带的JSCore,而在HarmonyOS中,由于业界无类似的框架&a…

C++11_左值引用与右值引用

在C11之前,是没有右值引用的概念的,在C11之后才新增了右值引用。其实无论是左值引用还是右值引用都是给对象取别名。 认识左值和右值 什么是左值? 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址可…

YOLOv11改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

一、本文介绍 本文记录的是改进YOLOv11的损失函数,将其替换成Shape-IoU。现有边界框回归方法通常考虑真实GT(Ground Truth)框与预测框之间的几何关系,通过边界框的相对位置和形状计算损失,但忽略了边界框本身的形状和…

PV大题--专题突破

写在前面: PV大题考查使用伪代码控制进程之间的同步互斥关系,它需要我们一定的代码分析能力,算法设计能力,有时候会给你一段伪代码让你补全使用信号量控制的操作,请一定不要相信某些人告诉你只要背一个什么模板&#…

Java线程入门

目录 一.线程相关概念 1.程序(program) 2.进程 3.线程 4.其他相关概念 二.线程的创建 1.继承Thread 2.Runnable接口 3.多线程机制(重要) 4.start() 三.线程终止--通知 四.线程(Thread)方法 1.常…

fastAPI教程:数据库操作

FastAPI 六、数据库操作 FastAPI支持操作各种数据库,但本身并没有内置关于任何数据库相关的模块。因此我们可以根据需求使用任何数据库,包括关系型(SQL)数据库,例如:PostgreSQL、MySQL、SQLite、Oracle、…

【AGC005D】~K Perm Counting(计数抽象成图)

容斥原理。 求出f(m) ,f(m)指代至少有m个位置不合法的方案数。 怎么求? 注意到位置为id,权值为v ,不合法的情况,当且仅当 v idk或 v id-k 因此,我们把每一个位置和权值抽象成点 ,不合法的情况之间连一…

【JVM】基础篇

1 初识JVM 1.1 什么是JVM JVM 全称是 Java Virtual Machine,中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 Java源代码执行流程如下: 分为三个步骤: 1、编写Java源代码文件。 …

自动驾驶系列—深度剖析自动驾驶芯片SoC架构:选型指南与应用实战

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

认知杂谈74《远离渣女陷阱,拥抱健康情感》

内容摘要: 渣女在感情中使用甜言蜜语陷阱,利用男性渴望理解和关爱的心理,通过虚假承诺和情感操控来获得利益。 男性易陷入这种陷阱,因为他们可能因压力大、感性而易受感动。为了避免这种情况,男性需要辨别言行一致性&a…

【含文档】基于Springboot+Vue的国风彩妆网站(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

软件设计之SSM(4)

软件设计之SSM(4) 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程,Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容: 基于配置类方式管理Bean 完全注解开发第三…

共模电感工作原理:【图文讲解】

共模电感,相信做电源较多的朋友用的比较多,而做消费级产品的朋友或许用的不是那么的多。但是还是有必要了解了解。 先上图,看看它长什么样子: (实物图) (结构图) 很显然&#xff0…

【Ubuntu】安装常用软件包-mysql

我的几个服务是部署在docker的同一个网络里,这样相互访问就可以通过docker容器的名字访问,比如容器A访问容器B,就可以http://B:8080/xxx 这样访问,不用关心ip是多少。 所以mysql前面文章给安装到主机里,感觉有点坑自己…

02.usePrevious

在 React 开发中,有时我们需要访问组件的前一个状态或属性。这在进行比较、动画或其他需要历史数据的操作时特别有用。usePrevious 钩子提供了一种简单而有效的方式来存储和访问前一个值。以下是如何实现和使用这个自定义钩子: const usePrevious valu…

【数据类型】C和C++的区别

文章目录 一、字符串二、布尔类型 bool三、数据的输入和输出 C和C在数据类型上打区别不大,下面就二者在这方面的部分区别做比较。 一、字符串 C语言和C在字符串的定义和书写风格上略有差异。 C风格字符串: char str[]"hello";C风格字符串 st…