LeetCode404. 左叶子之和

news2024/11/18 17:30:24

404. 左叶子之和

文章目录

      • [404. 左叶子之和](https://leetcode.cn/problems/sum-of-left-leaves/)
        • 一、题目
        • 二、题解
          • 方法一:递归
          • 方法二:迭代


一、题目

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

示例 1:

img

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例 2:

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

提示:

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

二、题解

方法一:递归

算法思路:

题目要求计算二叉树中所有左叶子节点的值之和。我们可以使用递归来解决这个问题。递归的思想是,对于每个节点,我们判断它是否是左叶子节点,如果是,则将其值加到结果中,然后递归地处理它的左子树和右子树。

具体实现:

  1. 我们首先定义一个变量 sum 来保存左叶子节点值的和,并初始化为0。

  2. 在递归函数 sumOfLeftLeaves 中,我们首先检查当前节点是否为空,如果为空,则返回0。

  3. 然后,我们检查当前节点的左子节点是否存在,以及左子节点是否为叶子节点。如果是叶子节点,则将其值加到 sum 中。

  4. 最后,我们递归地处理当前节点的左子树和右子树,将它们的返回值累加到 sum 中。

  5. 在每一层递归结束后,函数返回当前子树中左叶子节点的值之和。

/**
 * 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 sumOfLeftLeaves(TreeNode* root) {
        int sum = 0;
        if (root == nullptr) {
            return 0;
        }
        // 判断左子节点是否为叶子节点,如果是则将值加入 sum
        if (root->left && !root->left->left && !root->left->right) {
            sum += root->left->val;
        }
        // 递归处理左子树和右子树,并累加结果到 sum
        return sum + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
    }
};

算法分析:

  1. 时间复杂度:遍历整个二叉树的时间复杂度为 O(N),其中 N 是二叉树的节点数。在每个节点上,我们进行常数时间的判断和加法操作。

  2. 空间复杂度:递归函数的调用会占用栈空间,递归的深度最坏情况下为树的高度,所以空间复杂度为 O(H),其中 H 是二叉树的高度。在最坏情况下,二叉树可能退化为链表,高度为 N,此时空间复杂度为 O(N)。但在一般情况下,二叉树的高度平衡,空间复杂度会接近 O(logN)。

方法二:迭代

算法思路:

  1. 我们可以使用深度优先搜索(DFS)来遍历二叉树,使用栈来辅助遍历。
  2. 在遍历的过程中,对于每个节点,我们检查它的左子节点是否存在,如果存在,继续检查左子节点是否为叶子节点(即没有左右子节点)。如果是叶子节点,则将其值加到累加器 sum 中。
  3. 对于非叶子节点,我们将左子节点压入栈,以便后续继续检查。
  4. 然后,无论是否有右子节点,都将右子节点压入栈,以确保我们遍历了所有可能的路径。

具体实现:

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        stack<TreeNode*> st;
        int sum = 0;
        
        if (root == nullptr) {
            return 0;
        }
        
        st.push(root);
        
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            
            if (node->left) {
                if (!node->left->left && !node->left->right) {
                    sum += node->left->val; // 如果左子节点是叶子节点,将值加入 sum
                } else {
                    st.push(node->left); // 如果左子节点不是叶子节点,将左子节点压入栈
                }
            }
            
            if (node->right) {
                st.push(node->right); // 将右子节点压入栈,无论是否为叶子节点
            }
        }
        
        return sum;
    }
};

算法分析:

  • 时间复杂度:遍历整个二叉树的时间复杂度为 O(N),其中 N 是二叉树的节点数。在每个节点上,我们进行常数时间的判断、加法和栈操作。
  • 空间复杂度:使用了一个栈来辅助遍历,栈的空间占用与二叉树的高度相关,最坏情况下为 O(N)。因此,总体空间复杂度为 O(N)。

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

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

相关文章

个人信息保护合规审计如何做?

8月3日&#xff0c;为指导、规范个人信息保护合规审计活动&#xff0c;根据《中华人民共和国个人信息保护法》等法律法规&#xff0c;国家互联网信息办公室就《个人信息保护合规审计管理办法&#xff08;征求意见稿&#xff09;》&#xff08;简称《办法》&#xff09;及配套的…

【Apifox】Apifox设置全局Token:

文章目录 一、获取登录Token和设置全局变量&#xff1a;二、设置全局参数&#xff1a;三、效果&#xff1a; 一、获取登录Token和设置全局变量&#xff1a; 二、设置全局参数&#xff1a; 三、效果&#xff1a;

盘点7月Sui生态发展,了解Sui的近期成长历程!

自5月Sui主网上线三个月以来&#xff0c;7月是Sui网络进行最多次重要更新的一个月&#xff0c;Sui网络和生态正呈指数形式不断向上发展。为吸引更多的项目或开发者加入生态构建以及活跃用户参与生态&#xff0c;Sui基金会推出了Builder House、黑客松、Bullshark Quests、NFT再…

数据库:MYSQL参数max_allowed_packet 介绍

1、参数作用 max_allowed_packet参数是指mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小。如果超过了设置的最大长度,则会数据库保持数据失败。 2、问题场景 ● 有时候业务的需要,可能会存在某些字段数据长度非常大(比如富文本编辑器里面的内容),…

基于Java的学生管理系统设计与实现

一、系统功能介绍 基于Java的学生管理系统&#xff0c;本系统包括学生信息管理、学生成绩管理、县教育信息管理、个人资料管理等功能。 二、相关页面展示 以下是页面展示&#xff1a; 1 登录页面 2 首页页面页面 3 学生成绩查询页面 4 本校成绩排行页面 5 管理员学生成绩管…

【Apollo学习笔记】—— Cyber RT之调度

文章目录 前言相关代码整理 调度介绍Cyber RT的改进实时操作系统资源限制&优先级协程 Cyber RT调度策略任务窃取两种任务类型componen组件自定义任务 Cyber调度实践配置文件DAG文件cyber_launch文件component组件BUILD文件 问题参考 前言 本文是对Cyber RT的学习记录,文章可…

4G WWAN设备类型

WWAN设备类型 USB dongle是设备接入互联网的重要方式之一&#xff0c;典型的通过USB接口与主设备连接&#xff0c;然后主设备通过4G/5G接入互联网&#xff0c;作为移动宽带设备&#xff0c;它有那些设备类型及暴露方式呢&#xff1f; 移动宽带设备类型&#xff1a;ModemManage…

无涯教程-Lua - nested语句函数

Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。 nested loops - 语法 Lua中嵌套for循环语句的语法如下- for init,max/min value, increment dofor init,max/min value, incrementdostatement(s)endstatement(s) end Lua编程语言中的…

Podman权限问题导致的403报错思路与解决

问题 podman运行镜像&#xff0c;端口映射、卷映射无误&#xff0c;但在运行访问测试容器内http接口报错403. 查阅系统日志&#xff0c;存在多处容器相关的selinux访问被拒绝错误&#xff0c;sealert提示需要为几个进程的对象添加临时规则。 考虑是否为selinux问题&#xff…

语义分割文献整理

2014年文献 1.论文题目《Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs》 1.1.网络别名《DeepLabV1》 1.2.论文引用 Chen L C, Papandreou G, Kokkinos I, et al. Semantic image segmentation with deep convolutional nets and fu…

AI赋能转型升级 助力打造“数智辽宁”——首次大模型研讨沙龙在沈成功举行

当前&#xff0c;以“ChatGPT”为代表的大模型正在引领新一轮全球人工智能技术发展浪潮&#xff0c;推动人工智能从以专用小模型定制训练为主的“手工作坊时代”&#xff0c;迈入以通用大模型预训练为主的“工业化时代”&#xff0c;正不断加速实体经济智能化升级&#xff0c;深…

(自控原理)控制系统的数学模型

目录 一、时域数学模型 1、线性元件微分方程的建立 2、微分方程的求解方法​编辑 3、非线性微分方程的线性化 二、复域数学模型 1、传递函数的定义 2、传递函数的标准形式 3、系统的典型环节的传递函数 4、传递函数的性质 5、控制系统数学模型的建立 6、由传递函数求…

【C++】带三维重建和还原的RIS/PACS源码

【PACS】集成三维影像后处理功能&#xff0c;包括三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜、最大/小密度投影、心脏动脉钙化分析等功能。系统功能强大&#xff0c;代码完整。 一、RIS/PACS系统简介 RIS/PACS系统在预约登记、分诊叫号、技师检查、诊断报告…

面向开发人员的远程桌面:随时随地安全编写代码

随着数字世界的不断发展&#xff0c;传统意义上的“工作场所”概念正在发生重大转变。这种转变在科技行业尤其明显&#xff0c;开发人员和软件工程师越来越倾向于选择远程或混合办公模式。 在这次重大转变中&#xff0c;远程桌面软件经证明是一项足以影响远程办公的技术。通过…

YOLOv5改进系列(18)——更换Neck之AFPN(全新渐进特征金字塔|超越PAFPN|实测涨点)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——简单应用

在诸如广告、推荐等系统中&#xff0c;我们往往会涉及过滤、召回和排序等过程。随着系统业务变得复杂&#xff0c;代码的耦合和交错会让项目跌入难以维护的深渊。于是模块化设计是复杂系统的必备基础。这篇文章介绍的业务框架脱胎于线上多人协作开发、高并发的竞价广告系统&…

java系列之list集合分组

文章目录 前言一、list是什么&#xff1f;二、list集合分组总结 前言 在Java编程中&#xff0c;List集合是一种常用的数据结构&#xff0c;用于存储一组元素。有时候&#xff0c;我们需要对List集合中的元素进行分组操作&#xff0c;即将相同属性或特征的元素归类到一组。这种…

金三银四好时节,python面试10K+能不能得到?

嗨害大家好鸭&#xff01;我是小熊猫~ 金三银四好时节&#xff0c;面试10K能不能得到&#xff1f; 这次正逢面试季&#xff0c;这次给大家带来一个真实面试题 虽然最后上的班不一定是自己喜欢的&#xff0c; 但是工作还是要有哇&#xff01; 第三方库: requests >>>…

【C++杂货铺】string使用指南

文章目录 前言一、介绍二、string类的常用接口说明2.1 常见的构造接口2.2 与容量有关的接口2.3 与对象访问及遍历有关的操作2.4 与对象修改有关的操作2.5 与查找有关的接口2.6 string类的非成员函数2.7 与类型转换有关的接口 前言 在C语言中&#xff0c;字符串是以\0结尾的一些…

Win10、11集体翻车,祖传Bug连关机都不能

基本可以确定的是&#xff0c;微软将在2024年推出或名为 Win12 的下一代 Windows 。 Win10、11 的更新跨度肉眼可见放缓&#xff0c;可频率嘛&#xff0c;仍然一月几更。 如果你没有禁用更新&#xff0c;应该和小蝾一样&#xff0c;下班关机时经常有熟悉的选项。 不过在大多数…