力扣第404题 左叶子之和 c++ 递归 与 迭代解法

news2024/11/23 11:19:30

题目

404. 左叶子之和

简单

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

示例 1:

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

示例 2:

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

提示:

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

思路和解题方法一(递归)

  1. 首先判断当前节点是否为空,如果为空,返回0。
  2. 递归计算左子树中所有左叶子节点的和,将结果保存在变量lsum中。
  3. 判断当前节点的左子节点是否存在,并且左子节点没有左孩子和右孩子(即为左叶子节点),如果满足条件,将当前左叶子节点的值赋给lsum
  4. 递归计算右子树中所有左叶子节点的和,将结果保存在变量rsum中。
  5. 计算当前节点的左叶子节点的和,即lsum + rsum,并返回。

通过递归调用,最终会计算出二叉树中所有左叶子节点的和。

复杂度

        时间复杂度:

                O(n)

时间复杂度为O(n),其中n是二叉树中的节点数。

        空间复杂度

                O(n)

空间复杂度:
这个递归函数使用了栈来存储递归调用的上下文。由于二叉树的深度可能非常大,因此递归调用的栈空间取决于二叉树的深度。在最坏的情况下,如果二叉树是倾斜的,即所有节点都在左子树或右子树中,那么递归调用的栈空间将是O(n)。因为需要为每个递归调用分配栈空间,所以空间复杂度是O(n)。

c++ 代码

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) { // 定义一个函数来计算二叉树中左叶子结点之和
        if (root == nullptr) return 0; // 如果当前节点为空,则返回0
        int lsum = sumOfLeftLeaves(root->left); // 递归计算左子树的左叶子结点之和
        if(root->left != nullptr&&root->left->left ==nullptr && root->left->right==nullptr)
            // 如果当前节点的左孩子存在且没有左右子节点,即为左叶子节点
        {
            lsum = root->left->val; // 将当前左叶子节点的值赋给lsum
        }
        int rsum = sumOfLeftLeaves(root->right); // 递归计算右子树的左叶子结点之和
        int sum  =  lsum + rsum; // 计算当前节点中所有左叶子结点之和
        return sum; // 返回当前节点中所有左叶子结点之和
    }
};

思路和解题方法二(迭代)

  1. 首先创建一个栈st,用于存储待处理的节点。
  2. 判断根节点root是否为空,如果为空,返回0。
  3. 将根节点root压入栈st中。
  4. 初始化结果变量result为0。
  5. 进入循环,直到栈st为空:
    • 弹出栈顶元素,并将其赋给临时变量node,表示当前处理的节点。
    • 如果node的左孩子存在,并且左孩子没有左右子节点(即为左叶子节点),将左叶子节点的值累加到result中。
    • 如果node有左孩子,将左孩子压入栈st中,以便后续处理。
    • 如果node有右孩子,将右孩子压入栈st中,以便后续处理。
  6. 循环结束后,返回结果变量result,即为二叉树中所有左叶子节点的和。

通过使用栈进行迭代,遍历并处理每个节点,最终求得二叉树中所有左叶子节点的和。

复杂度

        时间复杂度:

                O(n)

时间复杂度是O(n),其中n是二叉树的节点数。因为要对每个节点进行一次入栈和出栈操作,并且还要对每个节点的左子节点进行一次检查。

        空间复杂度

                O(n)

空间复杂度是O(n)。

c++ 代码

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        stack<TreeNode*> st; // 定义一个存储节点指针的栈,用于迭代遍历二叉树
        if (root == nullptr) return 0; // 如果二叉树为空,则直接返回0
        st.push(root); // 将根节点压入栈中
        int res = 0; // 初始化结果变量为0
        while (!st.empty()) { // 当栈非空时,继续迭代处理
            TreeNode* node = st.top(); // 获取栈顶元素,即当前处理的节点
            st.pop(); // 弹出栈顶元素
            if (node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr) {
                // 如果当前节点存在左孩子节点,并且左孩子节点没有左右子节点,那么就是左叶子节点
                res += node->left->val; // 将当前左叶子节点的值累加到结果变量中
            }
            if (node->left != nullptr) st.push(node->left); // 如果当前节点存在左孩子节点,则将其压入栈中
            if (node->right != nullptr) st.push(node->right); // 如果当前节点存在右孩子节点,则将其压入栈中
        }
        return res; // 返回最终结果
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

【最新技术:grokking】机器学习模型是记忆还是泛化?

Do Machine Learning Models Memorize or Generalize? (pair.withgoogle.com) 机器学习模型是记忆还是泛化&#xff1f; 作者&#xff1a;Adam Pearce、 Asma Ghandeharioun、 Nada Hussein、 Nithum Thain、 Martin Wattenberg 和 Lucas Dixon 2023 年 <> 月 202…

NLP - 数据预处理 - 文本按句子进行切分

NLP - 数据预处理 - 文本按句子进行切分 文章目录 NLP - 数据预处理 - 文本按句子进行切分一、前言二、环境配置1、安装nltk库2、下载punkt分句器 三、运行程序四、额外补充 一、前言 在学习对数据训练的预处理的时候遇到了一个问题&#xff0c;就是如何将文本按句子切分&#…

最新AI智能创作系统源码AI绘画系统/支持GPT联网提问/支持Prompt应用

AI绘图专业设计 不得将程序用作任何违法违纪内容&#xff0c;不要让亲人两行泪 界面部分图解构&#xff1a; 前台show&#xff1a; 前端部署&#xff1a; 安装pm2管理器 点击设置 选择v16.19.1版本-切换版本 再新建一个网站 点击设置 添加反向代理-代理名称随便…

SpringMvc:为什么不能把controller类放到spring容器而必须放到SpringMvc容器?

因为在扫描Handler方法时&#xff0c;只会在SpringMvc容器中去查找bean 定义&#xff0c;不会查找父容器 因此&#xff0c;如果把controller放到Spring容器中直接报404。 而doGetBean方法是会查找子容器的&#xff0c;所以controller中可以注入父容器中的service和dao

设计模式 - 创建型模式考点篇:工厂模式、建造者模式

目录 一、创建型模式 一句话概括 1.1、工厂模式 1.1.1、简单工厂模式&#xff08;非 23 种经典设计模式&#xff09; 概述 案例 1.1.2、静态工厂&#xff08;扩展&#xff09; 1.1.3、工厂方法模式 概念 案例 1.2、建造者模式 1.2.1、概念 1.2.2、案例 1.2.3、建…

Deep learning of free boundary and Stefan problems论文阅读复现

Deep learning of free boundary and Stefan problems论文阅读复现 摘要1. 一维一相Stefan问题1.1 Direct Stefan problem1.2 Inverse Type I1.3 Inverse Type II 2. 一维二相Stefan问题2.1 Direct Stefan problem2.2 Inverse Type I2.3 Inverse Type II 3. 二维一相Stefan问题…

《视觉 SLAM 十四讲》第 7 讲 视觉里程计1 【如何根据图像 估计 相机运动】【特征点法】

github源码链接V2 文章目录 第 7 讲 视觉里程计17.1 特征点法7.1.1 特征点7.1.2 ORB 特征FAST 关键点 ⟹ \Longrightarrow ⟹ Oriented FASTBRIEF 描述子 7.1.3 特征匹配 7.2 实践 【Code】本讲 CMakeLists.txt 7.2.1 使用 OpenCV 进行 ORB 的特征匹配 【Code】7.2.2 手写 O…

windows 2003、2008远程直接关闭远程后设置自动注销会话

1、2003系统&#xff1a; 按开始—运行—输入“tscc.msc”&#xff0c;打开“终端服务配置”。 单击左边窗口的“连接”项&#xff0c;右边窗口中右击“RDP-TCP”&#xff0c;选择“属性”。 单击“会话”项&#xff0c;勾选“替代用户设置”&#xff0c;在“结束已断开的会话”…

C语言中文网 - Shell脚本 - 2

第1章 Shell基础&#xff08;开胃菜&#xff09; 2. Shell是运维人员必须掌握的技能 Linux 运维人员就是负责 Linux 服务器的运行和维护。随着互联网的爆发&#xff0c;Linux 运维在最近几年也迎来了春天&#xff0c;出现了大量的职位需求&#xff0c;催生了一批 Linux 运维培…

远程实时监控管理:5G物联网技术助力配电站管理

配电站远程监控管理系统是基于物联网和大数据处理等技术的一种创新解决方案。该系统通过实时监测和巡检配电场所设备的状态、环境情况、安防情况以及火灾消防等信息&#xff0c;实现对配电站的在线实时监控与现场设备数据采集。 配电站远程监控管理系统通过回传数据进行数据系…

Logback日志框架使用详解以及如何Springboot快速集成

Logback简介 日志系统是用于记录程序的运行过程中产生的运行信息、异常信息等&#xff0c;一般有8个级别&#xff0c;从低到高为All < Trace < Debug < Info < Warn < Error < Fatal < OFF off 最高等级&#xff0c;用于关闭所有日志记录fatal 指出每个…

LSM-Tree笔记

假设Level 0为内存中的Buffer&#xff0c;容量为 B B B&#xff0c;层与层之间的条目数量差 T T T 倍 Tiered Level 1共有 T T T 个runs&#xff0c;每个run的容量均为 B B BLevel 2共有 T T T 个runs&#xff0c;每个run的容量均为 T ⋅ B T\cdot B T⋅BLevel n共有 …

周记学习总结

10.3 今天加载出来了一下歌词&#xff0c;并且画了一下旁边的简单动画&#xff0c;然后画了一下下面的评论&#xff0c;今天主要是看了好多歌词滚动并且让它居中的&#xff0c;一直用的是scrollIntoView这个函数&#xff0c;但是这个函数似乎一直没有用&#xff0c;今天了解了…

多自由度工业机械臂机电系统

经过数百万年的进化创造了最通用和完善的工具——人类手臂。我们现代世界中的一切都得益于这个工具。即使到今天&#xff0c;工业界也没有找到比机器人手臂更多功能的工具来在三维空间中操纵物体&#xff0c;机器人手臂本质上是人类手臂的机电复制品。机器人手臂的多功能性确实…

企业关于低代码的需求——PDM 元数据电子审批流

企业关于低代码的需求 PDM 元数据电子审批流 审批流业务场景是现代企业运营中不可或缺的一环。业务流程从某个特定点开始,然后经过一系列的审批节点,完成流程的审批。这些节点通常由不同级别的人员担任,例如主管、经理、财务、法务和总经理等,每个人都扮演着特定的角色和…

阿里云数据库MongoDB恢复到本地

共两种方式&#xff0c;建议使用第二种的逻辑恢复&#xff0c;比较方便快捷 一、下载物理备份文件 下载的格式是xb的&#xff0c;主要跟实例创建时间有关&#xff0c;2019年03月26日之前创建的实例&#xff0c;物理备份文件格式为tar&#xff0c;后面全部都是xb的格式了&#…

DownloadingImages 下载缓存图片,显示图片文字列表

1. 用到的技术点: 1) Codable : 可编/解码 JSON 数据 2) background threads : 后台线程 3) weak self : 弱引用 4) Combine : 取消器/组合操作 5) Publishers and Subscribers : 发布者与订阅者 6) FileManager : 文件管理器 7) NSCache : 缓存 2. 网址: 2.1 测试接口网址: …

docker入门加实战—docker安装并配置阿里云加速

docker入门加实战—docker安装并配置阿里云加速 为什么要学习docker 在开发和部署项目的过程中&#xff0c;经常会遇到如下问题&#xff1a; 软件安装包名字复杂&#xff0c;不知道去哪里找安装软件和部署项目步骤复杂&#xff0c;容易出错 这就是我们今天要学习Docker技术…

7个在Github上的flutter开源程序

阅读大量代码是提高开发技能的最佳方法之一。该开源项目是了解最佳实践、编码风格和许多其他主题的最佳场所。 软件开发最受欢迎的领域之一是跨平台移动应用程序开发。Flutter 是您可以使用的最流行的跨平台移动应用程序开发工具之一。今天&#xff0c;我们将了解 7 个开源 Flu…

sqlalchemy 连接池

报错 sqlalchemy.exc.TimeoutError: QueuePool limit of size 100 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/3o7r) 查看数据库未活动超时时间 show variables like "interactive_timeout";一般…