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

题目

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; // 如果当前节点为空,则返回0int 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; // 如果二叉树为空,则直接返回0st.push(root); // 将根节点压入栈中int res = 0; // 初始化结果变量为0while (!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.mzph.cn/news/98333.shtml

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

相关文章

asp.net饭店订餐管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机设计定制

一、源码特点 asp.net 饭店订餐管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net饭店订餐系统 二、功能介…

设计模式 - 访问者模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 访问者模式&#xff0c;即在不改变聚合对象内元素的前提下&#xff0c;为聚合对象内每个元素提供多种访问方式&#xff0c;即聚合对象内的每个元素都有多个访问者对象。访问者模式主要解决稳定的数据结构和易变元素的操作之间的…

Unity实现设计模式——策略模式

Unity实现设计模式——策略模式 策略模式是一种定义一些列算法的方法&#xff0c;这些所有的算法都是完成相同的工作&#xff0c;只是实现不同。它可以通过相同的方式调用所有的算法&#xff0c;减少各种算法类与使用算法类之间的耦合。 策略模式的 Strategy 类层次为 Contex…

【Qt控件之QPushButton】使用及技巧

描述 QPushButton类是Qt中用于创建按钮的控件类&#xff0c;它继承自QAbstractButton类。 下面是QPushButton类的一些主要函数说明&#xff1a; QPushButton(QWidget *parent nullptr)&#xff1a;构造函数&#xff0c;创建一个QPushButton对象。 explicit QPushButton(cons…

放大招,百度文心大模型4.0正在加紧训练,即将发布

插播一条快讯&#xff01; &#xfeff;&#xfeff;刚刚看到一篇报道&#xff0c;说百度正在加紧训练文心大模型4.0&#xff01;百度5月发布了文心大模型3.5&#xff0c;才4个多月又要发布4.0了&#xff0c;这迭代速度简直了。据说这次发布将在10月17日百度世界大会上进行&am…

面试题-React(十):setState为什么使用异步机制?

在React中&#xff0c;setState的异步特性和异步渲染机制是开发者们经常讨论的话题。为什么React选择将setState设计为异步操作&#xff1f;异步渲染又是如何实现的&#xff1f;本篇博客将深入探究这些问题&#xff0c;通过代码示例解释为什么异步操作是React的一大亮点。 一、…

NeurIPS 2023 | 李飞飞团队提出SiamMAE:孪生掩码自编码器,刷榜视觉自监督方法

在计算机视觉领域&#xff0c;想要建立图像和场景&#xff08;scene&#xff09;之间之间的对应关系是一项比较困难的任务&#xff0c;尤其是在存在遮挡、视角改变或是物体外观发生变化的情况下。 最近&#xff0c;斯坦福大学李飞飞团队对MAE进行扩展&#xff0c;提出了孪生掩…

Tensorflow入门之 Hello World

Tensorflow入门之 Hello World 简介 Tensorflow 是 Google 开源的深度学习框架&#xff0c;来自于 Google Brain 研究项目&#xff0c;在 Google 第一代分布式机器学习框架 DistBelief 的基础上发展起来。 Tensorflow 的官方网址 http://www.tensorflow.org Tensorflow 的 G…

基于边缘网关的智慧工地监测方案

边缘物联网技术为千行百业赋能&#xff0c;依托边缘计算的低延时、高效率、广适用优势&#xff0c;也为工程建设产业带来新的增长动力。 例如在智慧工地应用中&#xff0c;围绕建设施工过程中的人员、设备、环境等要素&#xff0c;利用边缘计算网关构建全面的数据采集、分析、联…

web3.0时代分布式网络协议的异同

Web3.0时代标志着分布式网络协议的兴起&#xff0c;其中IPFS&#xff08;InterPlanetary File System&#xff09;和NDN&#xff08;Named Data Networking&#xff09;是备受瞩目的项目。尽管它们都属于分布式网络协议领域&#xff0c;但在多个方面存在显著区别。以下是IPFS和…

电子元器件选型与实战应用—05 电容选型第2篇

文章目录 1. 铝电解电容1.1 介绍1.2 铝电解电容优缺点2. 钽电容2.1 介绍2.2 钽电容优缺点3. 三个电容之间对比3.1 温度特性对比3.2 偏压特性对比3.3 ESR-频率曲线4. 电容类型选择5. 电容封装选择前文推荐: 电子元器件选型与实战应用—04 LDO选型、特性及应用电子元器件选型与实…

WebSocket ----苍穹外卖day8

介绍 实现步骤 各个模块详解 OnOpen OnOpen:标记一个方法作为处理WebSocket连接打开的方法 当一个客户端与服务器建立 WebSocket 连接时&#xff0c;服务器会接收到一个连接请求。一旦服务器接受了这个连接请求&#xff0c;一个 WebSocket 连接就会被建立。这时&#xff0c;被…

SpringMVC中异常处理详解

单个控制器异常处理 // 添加ExceptionHandler&#xff0c;表示该方法是处理异常的方法&#xff0c;属性为处理的异常类ExceptionHandler({java.lang.NullPointerException.class,java.lang.ArithmeticException.class})public String exceptionHandle1(Exception ex, Model mo…

Android kotlin内联函数(inline)的详解与原理

一、介绍 在kotlin中&#xff0c;有一种函数叫内联函数&#xff0c;这种函数标识符是inline&#xff0c;但是好多人对这个函数的理解只停留在八股文中&#xff0c;内容函数的用法和普通函数没有区别&#xff0c;但是在编译原理上是有&#xff0c;对程序的性能有一定的影响。 二…

wpf中prism框架

安装prism包&#xff1a; 添加引用 using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; using Prism.DryIoc; using Prism.Ioc;namespace PrismDemo …

【2023年11月第四版教材】第21章《项目管理科学基础》(合集篇)

第21章《项目管理科学基础》(合集篇) 1 章节内容2 工程经济学3 运筹学1 章节内容 【本章分值预测】和之前教材内容一样,有部分新增内容,预计选择题考4-5分,案例和论文本次考试预计不考;3次运筹学计算题课程和计算专题9需要认真学习一下! 2 工程经济学 财务方面三个主要…

【Amazon】基于AWS云实例(CentOS 7.9系统)使用kubeadm方式搭建部署Kubernetes集群1.25.4版本

文章目录 前言实验架构介绍K8S集群部署方式说明使用CloudFormation部署EC2实例集群环境准备修改主机名并配置域名解析&#xff08;ALL节点&#xff09;禁用防火墙禁用SELinux加载br_netfilter模块安装ipvs安装 ipset 软件包同步服务器时间关闭swap分区安装Containerd 初始化集群…

Flutter_Slider_SliderTheme_滑杆/滑块_渐变色

调用示例以及效果 SliderTheme(data: SliderTheme.of(context).copyWith(trackHeight: 3,// 滑杆trackShape: const GradientRectSliderTrackShape(radius: 1.5),// 滑块thumbShape: const GradientSliderComponentShape(rectWH: 14, overlayRectSpace: 4, overlayColor: Colou…

数据采集时使用HTTP代理IP效率不高怎么办?

目录 前言 一. 测试代理IP速度 二. 调整连接池大小 三. 多线程并发采集 四. 选择稳定的代理服务商 总结 前言 数据采集作为爬虫的重要环节之一&#xff0c;常常会遇到反爬虫的机制&#xff0c;封禁IP等等问题。为了规避这些问题&#xff0c;我们可以使用HTTP代理IP来进行…