二叉树题目:层数最深叶子结点的和

文章目录

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

题目

标题和出处

标题:层数最深叶子结点的和

出处:1302. 层数最深叶子结点的和

难度

4 级

题目描述

要求

给定一个二叉树的根结点 root \texttt{root} root,请你返回层数最深的叶子结点的和。

示例

示例 1:

示例 1

输入: root = [1,2,3,4,5,null,6,7,null,null,null,null,8] \texttt{root = [1,2,3,4,5,null,6,7,null,null,null,null,8]} root = [1,2,3,4,5,null,6,7,null,null,null,null,8]
输出: 15 \texttt{15} 15

示例 2:

输入: root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5] \texttt{root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]} root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5]
输出: 19 \texttt{19} 19

数据范围

  • 树中结点数目在范围 [1, 10 4 ] \texttt{[1, 10}^\texttt{4}\texttt{]} [1, 104]
  • 1 ≤ Node.val ≤ 100 \texttt{1} \le \texttt{Node.val} \le \texttt{100} 1Node.val100

解法一

思路和算法

由于层数最深的结点没有子结点,因此层数最深的结点一定是叶结点。计算层数最深的叶结点的和,即为计算层数最深的所有结点值总和。可以使用层序遍历实现。

从根结点开始依次遍历每一层的结点,在层序遍历的过程中需要区分不同结点所在的层,确保每一轮访问的结点为同一层的全部结点。遍历每一层结点之前首先得到当前层的结点数,即可确保每一轮访问的结点为同一层的全部结点。

对于每一层结点,遍历过程中可以得到当前层的结点值总和。

由于层序遍历访问结点的顺序为层数递增的顺序,因此最后遍历的层一定是层数最深的层。对于遍历的每一层,只要当前层至少有一个结点不是叶结点,则当前层一定不是层数最深的层,只有当遍历到的层的每个结点都是叶结点时,当前层才是层数最深的层,也是最后遍历的层。计算最后遍历的层的结点值总和,即可得到层数最深的所有结点值总和。

代码

class Solution {public int deepestLeavesSum(TreeNode root) {int sum = 0;Queue<TreeNode> queue = new ArrayDeque<TreeNode>();queue.offer(root);while (!queue.isEmpty()) {sum = 0;int size = queue.size();for (int i = 0; i < size; i++) {TreeNode node = queue.poll();sum += node.val;if (node.left != null) {queue.offer(node.left);}if (node.right != null) {queue.offer(node.right);}}}return sum;}
}

复杂度分析

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

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

解法二

思路和算法

也可以使用深度优先搜索计算层数最深的叶结点的和。从根结点开始遍历二叉树,遍历过程中需要维护二叉树的最大层数与最大层数的结点值总和。规定根结点在第 0 0 0 层,对于每个非空结点,都可以得到其结点值与所在层,执行如下操作:

  • 如果当前结点所在层等于最大层数,则将当前结点值加到最大层数的结点值总和;

  • 如果当前结点所在层大于最大层数,则将最大层数设为当前结点所在层,将最大层数的结点值总和设为当前结点值。

然后对当前结点的非空子结点继续遍历。

遍历结束之后即可得到最大层数的结点值总和。

代码

class Solution {int maxLevel = 0;int sum = 0;public int deepestLeavesSum(TreeNode root) {dfs(root, 0);return sum;}public void dfs(TreeNode node, int level) {if (level == maxLevel) {sum += node.val;} else if (level > maxLevel) {maxLevel = level;sum = node.val;}if (node.left != null) {dfs(node.left, level + 1);}if (node.right != null) {dfs(node.right, level + 1);}}
}

复杂度分析

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

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

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

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

相关文章

Qt的ui文件不能简单复制

在使用vsQt开发时&#xff0c;直接复制另外一个widget类的ui文件&#xff0c;简单改名成当前类对应的ui文件&#xff0c;会导致编译出错。尽可能使用添加的Qt class自带的ui文件&#xff0c;因为ui文件的配置文件中有许多与当前类相关的字符串&#xff0c;简单复制容易报错。

FE_Vue学习笔记 - 组件的理解vue vc

1 单文件组件 在Vue应用中&#xff0c;单文件组件&#xff08;Single File Components&#xff09;是一种特殊的文件格式&#xff0c;以 .vue 为后缀&#xff0c;它允许开发者在一个文件中定义一个Vue组件的全部内容。 每个单文件组件由三个部分组成&#xff1a;template&…

Flutter插件的制作和发布

Flutter制作插件有两种方式&#xff08;以下以android和ios为例&#xff09;&#xff1a; 目录 1.直接在主工程下的android和ios项目内写插件代码&#xff1a;2.创建独立Flutter Plugin项目&#xff0c;制作各端插件后&#xff0c;再引入项目&#xff1a;1. 创建Flutter Plugin…

STL list

文章目录 一、list 类的模拟实现 list 是一个带头双向循环链表&#xff0c;可以存储任意类型 模板参数 T 表示存储元素的类型&#xff0c;Alloc 是空间配置器&#xff0c;一般不用传 一、list 类的模拟实现 iterator 和 const_iterator 除了下述不同外&#xff0c;其他代码基…

【新版】系统架构设计师 - 软件架构设计<新版>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件架构设计&#xff1c;新版&#xff1e;考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD&#xff08;ABSDM模型&#xff09;的开发过程 软件架…

思维导图怎么画好看又简单?看看这个方法

思维导图怎么画好看又简单&#xff1f;思维导图是一种非常有用的工具&#xff0c;可以帮助我们组织和展示思维。如果你想要画出既好看又简单的思维导图&#xff0c;那么我们可以使用一些思维导图制作工具。下面就给大家介绍一款个人觉得很好用的思维导图制作工具。 【迅捷画图】…

金蝶云星空各种部署架构及适用场景分享

> 随着公司的快速发展上市到进入世界500强&#xff0c;作为技术经理&#xff0c;负责了金蝶云星空从单点部署到集群&#xff0c;再到替换SAP的过程&#xff0c;如今项目已经成功上线&#xff0c;所以对金蝶的相关知识也做下整理和归档。 > 在项目实施过程中&#xff0c;部…

Java实现图书管理系统

一、分析有主要对象 二、整理思路 三、框架的搭建 四、操作内部的具体实现 一、分析主要对象 我们做的图书管理系统的目的&#xff0c;是可以根据不同的用户&#xff0c;所能执行的操作不一样&#xff0c;主要有增删查改图书等操作&#xff0c;选择这些不同的操作会给我们反…

php预约系统源码 网上预约小程序开发源码 整套系统搭建让在线预约更便捷

随着互联网技术的发展&#xff0c;越来越多的服务行业开始通过网上预约系统来实现便捷的客户管理和服务提供。PHP预约系统源码作为一种成熟的技术方案&#xff0c;可以帮助商家快速搭建自己的预约系统&#xff0c;提高工作效率&#xff0c;优化客户体验。 分享一个php预约系统…

插槽指的是什么?插槽的基础用法体验

什么是插槽 插槽(Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时&#xff0c;把不确定的、希望由用户指定的部分定义为插槽。 <template><p>这是MyCom1组件的第1个p标签</p><&#xff01;--通过slot标签&#xff0c;为用户预留内容占位符…

Chatbot到底提供了哪些便利?来看看“中文版Chatbase”

Chatbot的出现可以说是在极大的程度上改变了企业与客户互动的方式。Chatbot凭借其先进的功能和全天候可用性提供了一系列便捷的功能&#xff0c;为企业和客户提供便利和高效。随着自然语言处理和机器学习算法的进步&#xff0c;Chatbot已经发展到可以提供准确和个性化的响应&am…

Python数据库编程:连接、操作和管理数据库

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Python作为一门多用途的…