当前位置: 首页 > news >正文

二叉树题目:左叶子之和

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:左叶子之和

出处:404. 左叶子之和

难度

3 级

题目描述

要求

给你二叉树的根结点 root \texttt{root} root,返回所有左叶子之和。

示例

示例 1:

示例 1

输入: root = [3,9,20,null,null,15,7] \texttt{root = [3,9,20,null,null,15,7]} root = [3,9,20,null,null,15,7]
输出: 24 \texttt{24} 24
解释:二叉树中有两个左叶子,结点值分别是 9 \texttt{9} 9 15 \texttt{15} 15

示例 2:

输入: root = [1] \texttt{root = [1]} root = [1]
输出: 0 \texttt{0} 0

数据范围

  • 树中结点数目在范围 [1, 1000] \texttt{[1, 1000]} [1, 1000]
  • -1000 ≤ Node.val ≤ 1000 \texttt{-1000} \le \texttt{Node.val} \le \texttt{1000} -1000Node.val1000

解法一

思路和算法

为了计算左叶子之和,需要找到二叉树中的所有是左子结点的叶结点并计算这些结点之和。可以使用深度优先搜索实现。

从根结点开始遍历二叉树,对于每个结点,首先判断其左右子结点是否为空,然后对非空子结点执行如下操作。

  • 如果左子结点不为空,当左子结点是叶结点时将左子结点的值加到左叶子之和,当左子结点不是叶结点时在左子树中继续遍历。

  • 如果右子结点不为空且不是叶结点,则在右子树中继续遍历。

上述过程是一个递归的过程,递归的终止条件是当前结点为叶结点或者当前结点的非空子结点都为叶结点,其余情况都会调用递归。由于只有在访问到的结点的左子结点是叶结点的情况下才会将左子结点值加到左叶子之和,因此可以确保每个左叶子都被计算一次且其他结点都不会被计算。

代码

class Solution {public int sumOfLeftLeaves(TreeNode root) {int sum = 0;if (root.left != null) {if (isLeaf(root.left)) {sum += root.left.val;} else {sum += sumOfLeftLeaves(root.left);}}if (root.right != null && !isLeaf(root.right)) {sum += sumOfLeftLeaves(root.right);}return sum;}public boolean isLeaf(TreeNode node) {return node.left == null && node.right == null;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉树的高度,最坏情况下二叉树的高度是 O ( n ) O(n) O(n)

解法二

思路和算法

也可以使用广度优先搜索计算左叶子之和。

广度优先搜索需要使用队列存储待访问的结点,初始时将根结点入队列。每次将一个结点出队列,首先判断其左右子结点是否为空,然后对非空子结点执行如下操作。

  • 如果左子结点不为空,当左子结点是叶结点时将左子结点的值加到左叶子之和,当左子结点不是叶结点时将左子结点入队列。

  • 如果右子结点不为空且不是叶结点,则将右子结点入队列。

当队列为空时遍历结束,此时即可得到左叶子之和。

由于只有在访问到的结点的左子结点是叶结点的情况下才会将左子结点值加到左叶子之和,因此可以确保每个左叶子都被计算一次且其他结点都不会被计算。

代码

class Solution {public int sumOfLeftLeaves(TreeNode root) {int sum = 0;Queue<TreeNode> queue = new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();if (node.left != null) {if (isLeaf(node.left)) {sum += node.left.val;} else {queue.offer(node.left);}}if (node.right != null) {if (!isLeaf(node.right)) {queue.offer(node.right);}}}return sum;}public boolean isLeaf(TreeNode node) {return node.left == null && node.right == null;}
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。每个结点都被访问一次。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉树的结点数。空间复杂度主要是队列空间,队列内元素个数不超过 n n n

http://www.lryc.cn/news/103136.html

相关文章:

  • Spark SQL报错: Task failed while writing rows.
  • Linux系统下U盘打不开: No application is registered as handling this file
  • 07 定时器处理非活动连接(上)
  • python——案例四:判断字符串中的元素组成
  • 一起学算法(插入排序篇)
  • JVM基础篇-本地方法栈与堆
  • 防雷保护区如何划分,防雷分区概念LPZ介绍
  • 随手笔记——3D−3D:ICP求解
  • Python调用各大机器翻译API大全
  • 重生之我要学C++第六天
  • SpringBoot中ErrorPage(错误页面)的使用--【ErrorPage组件】
  • 【Android】APP网络优化学习笔记
  • 简单的知识图谱可视化+绘制nx.Graph()时报错TypeError: ‘_AxesStack‘ object is not callable
  • 【Matlab】基于粒子群优化算法优化BP神经网络的时间序列预测(Excel可直接替换数据)
  • 【机器学习】Cost Function for Logistic Regression
  • 【EI/SCOPUS会议征稿】2023年第四届新能源与电气科技国际学术研讨会 (ISNEET 2023)
  • 【计算机网络】10、ethtool
  • 什么是前端工程化?
  • 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程
  • Matlab 一种自适应搜索半径的特征提取方法
  • 基于opencv的几种图像滤波
  • puppeteer代理的搭建和配置
  • 【简单认识MySQL的MHA高可用配置】
  • 【云原生】一文学会Docker存储所有特性
  • Android Ble蓝牙App(一)扫描
  • mac pd安装ubuntu并配置远程连接
  • 1.3 eureka+ribbon,完成服务注册与调用,负载均衡源码追踪
  • mysql修改字段长度是否锁表
  • SpringCloud集成OpenTelemetry的实现
  • Python爬取IP归属地信息及各个地区天气信息