【LeetCode】404. 左叶子之和

news2025/1/14 2:29:47

1.问题

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1

在这里插入图片描述

输入: root = [3,9,20,null,null,15,7]
输出: 24

解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2

输入: root = [1]
输出: 0

提示:

  • 节点数在 [1, 1000] 范围内
  • -1000 <= Node.val <= 1000

2.解题思路

2.1 递归

按照题目描述,我们需要遍历每个树节点,对于目标值,我们需要判定某个节点是否是需要的,既要判定是叶子节点,又要判定是左边的叶子节点,因而对于和的组成,进行分类谈论,如下:
1)节点为null,返回;
2)该节点左子树不为空,且为叶子节点,sum+=该节点的value;否则递归左子树;
3)该节点右子树不为空,这里又要分类:
3.1)右子树为叶子节点,不是题目需要的值的组成部分;
3.2)右子树的子节点,只要左右其中一个不为空,继续递归。

伪代码:

//sumOfLeftLeaves(TreeNode root)为计算root所有左叶子节点的和的函数。
int sumOfLeftLeaves(TreeNode root){
	//节点为null
	if root 为null
		return 0;
	//左子树
	if root.left 不为null
		//root.left为叶子节点
		if(root.left为叶子节点){
			sum+=root.left.val;
		}
		//否则,继续递归左子树
		else {
			sum+=sumOfLeftLeaves(root.left);
		}
	
	//右子树
	if root.right 不为null
		//只要不是叶子节点,继续递归
		if root.right 不是叶子节点
		 sum+=sumOfLeftLeaves(root.right);
	return sum;
}

而判定是否是叶子节点,代码如下:

//判定是叶子节点
private boolean isLeaf(TreeNode node){
    return null!=node && null==node.left && null==node.right;
}

2.2 改进的递归

上述递归流程,过程是清晰明了的,但判定逻辑有点复杂,对于题目已知的条件,我们只需要抓重点,左叶子节点的和,其他都放在递归算法里了。
详细代码,见第3节代码。

2.3 BFS

前面讨论的算法,遍历路径类似前序遍历,先根节点,再左右子节点,本质思想还是深度优先(DFS)。在二叉树遍历系列文章中,我们可以利用层序遍历,同样可以解决本章问题,其思想还是广度优先算法(BFS)。

3.代码

3.1 递归算法

public int sumOfLeftLeaves2(TreeNode root) {
   if(null==root){
       return 0;
   }
   int sum=0;
   if(null!=root.left){
       //左子树为叶子节点,直接加上,否则继续递归左子树
       if(isLeaf(root.left)){
           sum+=root.left.val;
       }else {
           sum+=sumOfLeftLeaves(root.left);
       }
   }
   //右子树只要不为空,且至少存在一个节点(不管是左还是右)
   if(null!=root.right){
       if(!isLeaf(root.right)){
           sum+=sumOfLeftLeaves(root.right);
       }
   }
   return sum;
}

3.2 改进的递归

int sum=0;
public int sumOfLeftLeaves(TreeNode root) {
    dfs(root);
    return sum;
}

private void dfs(TreeNode root){
    if(null==root){
        return;
    }
    //是左叶子节点
    if(null!=root.left && isLeaf(root.left)){
        sum+=root.left.val;
    }
    //继续遍历左右子树
    dfs(root.left);
    dfs(root.right);
}

3.3 广度优先算法

public int sumOfLeftLeaves(TreeNode root) {
   if(null==root){
       return 0;
   }
   int sum=0;
   //队列
   Queue<TreeNode> q=new LinkedList<>();
   q.offer(root);
   TreeNode node;
   //遍历队列
   while(!q.isEmpty()){
       node=q.poll();
       if(null==node){
           continue;
       }
       //左叶子节点
       if(null!=node.left && isLeaf(node.left)){
           sum+=node.left.val;
       }
       q.offer(node.left);
       q.offer(node.right);
   }
   return sum;
}

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

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

相关文章

day4-中等篇-环形链表2

这是环形链表的升级版&#xff0c;也就是找到尾部连接的第二个节点并返回&#xff1b; 分两步&#xff1a;第一步判断是否有环&#xff0c;第二步找到节点 为什么找到节点是这样&#xff1f;原因是快慢指针相遇之后&#xff0c;慢指针到head的距离和新指针q到head的距离相同&am…

Koa2的基本使用

一、新建一个文件夹 首先打开终端&#xff0c;输入node -V命令检查Node版本&#xff0c;对于Koa2框架需要Node版本高于7.6使用npm init -y这个命令可以快速创建出package.json文件使用npm install koa下载最新版本koa到当前项目 二、初步使用 创建app.js // 创建koa对象 c…

FPGA时序约束(四)主时钟、虚拟时钟和时钟特性的约束

系列文章目录 FPGA时序约束&#xff08;一&#xff09;基本概念入门及简单语法 FPGA时序约束&#xff08;二&#xff09;利用Quartus18对Altera进行时序约束 FPGA时序约束&#xff08;三&#xff09;时序约束基本路径的深入分析 文章目录 系列文章目录前言主时钟约束跨时钟域…

“echo >”和“echo >>”的区别

“echo >”和“echo >>”的区别 命令“echo >”代表输出重定向 命令“echo >>”输出追加重定向 echo hello A 将字符串hello A输出到屏幕 echo hello A > tmp.txt 将字符串输出重定向&#xff0c;当前目录没有tmp.txt&#xff0c;则创建tmp.txt&#xff…

wangEditor5在Vue3中的自定义图片+视频+音频菜单

本文适用于wangEditor5用在Vue3中自定义扩展音频、视频、图片菜单&#xff1b;并扩展音频元素节点&#xff0c;保证音频节点的插入、读取、回写功能正常&#xff1b;支持动态修改尺寸。适用于初学者。 1、官网关键文档。 ButtonMenu&#xff1a;自定义扩展新功能 | wangEdito…

所有Gcc版本对C和C++的支持情况(超详细版本)

在最近接触的新的项目&#xff0c;由于技术使用为C98风格实现&#xff0c;遇到一个问题需要加锁解决&#xff0c;本能反应用lock_guradmutex解决&#xff0c;但是没设置CFLAGS为C11标准&#xff0c;不确定当前gcc编译器默认支持的C和C标准是什么&#xff0c;索性就一把都研究透…

G - 李华和图案

第一周刷题&#xff1a; 【题目描述】 李华有大小的格局nn&#xff0c;每个单元格为蓝色或红色。他可以表演完全k操作。在每次操作中&#xff0c;他选择一个单元格并将其颜色从红色更改为蓝色或从蓝色更改为红色。每个单元格都可以根据需要多次选择。是否有可能使图案与其旋转…

Vue-高德地图-立体多边形绘制

前言 在前端开发中&#xff0c;地图展示是常见的需求之一。而高德地图作为国内知名的地图服务商&#xff0c;其提供的 API 功能丰富&#xff0c;使用也相对简单。 本篇文章将介绍如何在 Vue2 中使用 amap/amap-jsapi-loader 安装高德地图并展示地图。 准备工作 首先需要在高…

02 【Sass语法介绍-变量】

sass有两种语法格式Sass(早期的缩进格式&#xff1a;Indented Sass)和SCSS(Sassy CSS) 目前最常用的是SCSS&#xff0c;任何css文件将后缀改为scss&#xff0c;都可以直接使用Sassy CSS语法编写。 所有有效的 CSS 也同样都是有效的 SCSS。 Sass语法介绍-变量 1.前言 Sass …

华为面试题:1+4=5,2+5=12,3+6=21,问8+11=?网友:幼儿园级别

面试&#xff0c;一直都是职场人士绕不过去的坎&#xff0c;对于有的人来说&#xff0c;或许更擅长日常的工作&#xff0c;在面试环节可谓是自己的薄弱环节&#xff0c;但对于有的人来说&#xff0c;相比于工作&#xff0c;更擅长应付面试&#xff01; 最近&#xff0c;有一位…

为了了解国外AI最新动态,分享我经常逛的6 个 YouTube AI频道

AI 正在迅速发展&#xff0c;每周都会有一篇关于该领域新发展的新论文&#xff0c;一种可以提高您工作效率的 AI 工具&#xff0c;或者一个改变一切的公告。 这就是为什么在本文中&#xff0c;我想与您分享最好的 YouTube 频道&#xff0c;以便及时了解 AI 的最新动态。这些 Y…

JUC多并发编程 原子类

基本类型原子类 AtomicIntegerAtomicBooleanAtomicLong 方法说明public final int get()获取当前的值public final int getAndSet(int newValue)获得当前的值,并设置新的值public final int getAndIncrement()获得当前的值&#xff0c;并自增public final int getAndDecremen…

C++内存管理之拷贝memcpy、分配malloc 与释放free

1.内存拷贝 memcpy C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。 #声明&#xff1a; void *memcpy(void *str1, const void *str2, size_t n)#********************** str1 -- 指向用于存储复制内容的目标数组…

【数据结构】二叉树-OJ

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 一、相同的树 二、翻转二叉树 三、单值二叉树 四、 二叉树的最大深度 一、相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。如果两个…

第六章 3D地形搭建(上)

Unity 提供了多种工具来创建环境特征&#xff0c;例如地形和植被。要在场景中添加地形 (Terrain) 游戏对象&#xff0c;请从菜单中选择 GameObject > 3D Object > Terrain。此过程也会在 Project 视图中添加相应的地形资源。默认情况&#xff0c;场景中出现一个大型平坦的…

Spring AOP 代码加案例详解

Spring AOP目录 Spring AOP主要内容代理模式静态代理动态代理JDK动态代理CGLIB 动态代理JDK代理与CGLIB代理的区别 Spring AOP当前项目存在问题和解决Spring AOP的介绍AOP基本概念实现AOP的两种方式 Spring AOP —— Schema-based方式前置通知 - 入门案例思考后置通知异常通知环…

高压功率放大器在脉冲X射线源技术及火星X射线通信中的应用

实验名称&#xff1a;高速调制脉冲X射线源技术及火星X射线通信应用研究 研究方向&#xff1a;通信技术 测试目的&#xff1a; 火星是深空探测的热点区域&#xff0c;随着对火星探测的深入&#xff0c;未来火星探测器将面临传统通信方式难以应对的恶劣情况&#xff0c;例如火…

ROS学习5:ROS常用组件

【Autolabor初级教程】ROS机器人入门 1. TF 坐标变换 背景 现有一移动式机器人底盘&#xff0c;在底盘上安装了一雷达&#xff0c;雷达相对于底盘的偏移量已知&#xff0c;现雷达检测到一障碍物信息&#xff0c;获取到坐标分别为(x,y,z)&#xff0c;该坐标是以雷达为参考系的…

测试岗35k*16薪,性能测试面试题问什么?测试老鸟总结分析(附答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试面试题&am…

【Python/机器学习】不使用Conda安装Pytorch和Torchvision(Windows系统)

这篇文章介绍如何不使用conda等包管理系统在Windows系统上直接使用pip安装Pytorch和Torchvision。首先你需要有Python 3.6以上的64位环境&#xff08;32位是不可以的哟&#xff01;&#xff09;&#xff0c;并且假设你有NVIDIA显卡且已安装CUDA。 文章目录 1. 查看CUDA版本2. 找…