面试经典150题——求根节点到叶节点数字之和

brown hay on tractor under white and blue sky during daytime

1. 题目描述

image-20240425095614704

2.  题目分析与解析

2.1 思路一——DFS

  1. 理解问题: 首先要理解题目的要求,即对于给定的二叉树,我们需要找出从根节点到所有叶子节点的所有路径,然后将每一条路径上的数字组成一个整数,最后求出这些整数的和。

  2. 定义递归函数: 递归函数的目的是遍历树,同时记录下遍历到当前节点为止形成的数字。递归函数可以接收两个参数:当前节点和当前路径代表的数字。

  3. 编写递归逻辑

    • 递归出口:如果当前节点是叶子节点(即没有左右子节点),则将当前路径代表的数字加到总和中。

    • 递归过程:如果当前节点不是叶子节点,则对其左右子节点进行递归调用,同时更新路径代表的数字。

  4. 计算路径数字: 在从根节点向下遍历的过程中,每向下一层,路径代表的数字就要左移一位(即乘以10),然后加上当前节点的值。

  5. 全局变量或返回值: 为了存储总和,可以使用全局变量,或者在递归函数中返回当前累加的和,并在上一层递归中将返回值累加。

  6. 开始递归: 最初调用递归函数时,从根节点开始,并且当前路径数字为0。

  7. 边界条件: 考虑空树或只有一个节点的树的边界条件。

2.2 思路二——BFS

  1. 理解BFS和递归的区别: 广度优先搜索(BFS)与递归方法不同,它使用队列来迭代地遍历树的每一层。在BFS中,我们按照树的层级从上到下逐层遍历节点,而递归方法通常是深度优先搜索(DFS),从根节点开始直到叶子节点,然后回溯。

  2. 初始化: 在方法中,首先检查根节点是否为null。如果是,返回0。否则,初始化一个队列layer来保存树的每层节点。

  3. 处理根节点: 将根节点加入队列。

  4. 层序遍历: 当队列不为空时,循环执行以下步骤:

    • 从队列中取出一个节点作为当前节点。

    • 检查当前节点是否有左子节点,如果有,则计算左子节点代表的新数字并更新左子节点的值,然后将左子节点加入队列。

    • 检查当前节点是否有右子节点,如果有,同样计算右子节点代表的新数字并更新右子节点的值,然后将右子节点加入队列。

    • 如果当前节点是叶子节点(没有左右子节点),将它的值加到结果result中。

  5. 更新节点值: 在每个非叶子节点上,更新其左右子节点的值为 当前节点的值*10+子节点的原始值。这一步模拟深度优先过程中的路径数字累加。

  6. 累加叶子节点的值: 对于每个叶子节点,其值现在代表了从根节点到该叶子节点的路径数字。将这些数字累加到结果变量result中。

  7. 返回结果: 遍历完成后,返回result,它包含了所有从根节点到叶子节点路径所代表的数字之和。

3. 代码实现

3.1 思路一

image-20240425101217123

image-20240425101129709

3.2 思路二

image-20240425100048754

image-20240425095552662

4. 相关复杂度分析

BFS方法(层序遍历)

  • 时间复杂度:O(N),其中N是树中节点的数量。在BFS中,每个节点恰好被访问一次,无论是内部节点还是叶子节点。

  • 空间复杂度:最坏情况下(完全二叉树)是O(N),因为队列需要存储一层中的所有节点,对于完全二叉树来说,最底层的节点大约占总节点数的一半。在最好的情况下(高度倾斜的树),空间复杂度是O(1),因为队列中同时只有一个元素。

DFS方法(深度优先遍历)

  • 时间复杂度:O(N),与BFS相同,每个节点恰好被访问一次。

  • 空间复杂度:最坏情况下(完全非平衡树,即链表形状)是O(N),因为要存储递归栈。在最好情况下(完全二叉树),空间复杂度是O(logN),对应于树的高度。

总结

  • 对于时间复杂度,两种方法都是O(N),因为两种方法都会访问树中的每一个节点。

  • 对于空间复杂度,BFS和DFS之间的差异通常依赖于树的形状。对于大多数情况,DFS的空间复杂度较低,因为它的最坏情况是高度倾斜的树。而BFS在最坏情况下可能需要存储许多节点。

需要注意的是,DFS递归的空间复杂度也包括隐式的调用栈。在实际情况中,如果树非常深,DFS可能会因为堆栈溢出而不如BFS稳定。相反,如果树非常宽,则BFS可能会因为队列变得非常大而消耗更多内存。

当然需要提示一下:我的代码中BFS方法修改了树的结构,因为它实际上改变了节点的值来存储路径总和。这在实际应用中可能是不可取的,因为它破坏了原始数据,如果像解决这个问题就是采用一个和队列相同结构的部分存储值就行。DFS方法则没有这个问题,它保持了树的结构不变。

image-20240301121908772

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JSP在页面用<%=调用声明函数时出现HTTP 500错误

JSP在页面用<%调用声明函数时出现HTTP 500错误 错误描述&#xff1a; Eclipse在编写JSP页面时&#xff0c;在其中采用<%&#xff01;%>方式声明了函数&#xff0c;然后在页面中用<%函数名%>方式调用时&#xff0c;出现HTTP状态500错误&#xff0c;提示为&#…

github Copilot的使用总结

1. 代码建议和补全 GitHub Copilot 的基本使用涉及编写代码时的实时代码建议和补全。一旦你已经安装并配置好 GitHub Copilot 插件&#xff0c;你可以在支持的编辑器&#xff08;如 Visual Studio Code&#xff09;中开始使用 Copilot。以下是一些基本的使用步骤&#xff1a; …

《苍穹外卖》Day10部分知识点记录

一、Spring Task 介绍 Spring Task是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑。 定位&#xff1a;定时任务框架 作用&#xff1a;定时自动执行某段Java代码 应用场景&#xff1a;只要是需要定时处理的场景都可以使用Spring Task …

飞书API(6):使用 pandas 处理数据并写入 MySQL 数据库

一、引入 上一篇了解了飞书 28 种数据类型通过接口读取到的数据结构&#xff0c;本文开始探讨如何将这些数据写入 MySQL 数据库。这个工作流的起点是从 API 获取到的一个完整的数据&#xff0c;终点是写入 MySQL 数据表&#xff0c;表结构和维格表结构类似。在过程中可以有不同…

重生奇迹mu装备掉落大全

1、骷髅兵&#xff1a; [一般宝]毒戒指(3%HP)石巨人召唤石玛雅雷之项链(1%)。 2、独眼巨人&#xff1a;4冰之戒指(2%)3雷之项链(2%)3毒之戒指天使3毒戒(3%回复)灵魂祝福石巨人石玛雅钻云枪石。 3、幽灵&#xff1a;3雷链(hp3%)守护天使小恶魔&#xff0c;灵魂宝石祝福4冰戒回3…

AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#x1f525;&#xff1a;探索设计模式的魅力&#xff1a;AI赋能分…

【探索Java编程:从入门到入狱】Day3

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

Redis分布式锁 - 基于Jedis和LUA的分布式锁

先基于单机模式&#xff0c;基于Jedis手工造轮子实现自己的分布式锁。 首先看两个命令&#xff1a; Redis 分布式锁机制&#xff0c;主要借助 setnx 和 expire 两个命令完成。 setnx命令: setnx 是 set if not exists 的简写。将 key 的值设为 value &#xff0c;当且仅当…

跨设备自动化协同提效新利器!边缘自动化流程编排工具

痛点剖析 随着企业生产环境的日益复杂化&#xff0c;不同生产设备间的协调性问题尤为凸显。 1、不同设备往往基于各自的技术标准、通信协议和操作系统设计&#xff0c;这使得它们之间的数据交换和指令传递存在显著的障碍。 2、技术上的不兼容性导致设备间难以实现无缝对接和…

Matplotlib是什么?

一、Matplotlib是什么&#xff1f; Matplotlib是一个Python语言的2D绘图库&#xff0c;它非常广泛地用于数据的可视化。以下是一些主要特点&#xff1a; 多功能性&#xff1a;它允许用户创建各种静态、动态或交互式的图表&#xff0c;如线图、散点图、直方图等。跨平台性&…

基于MSP430F249的电子钟仿真(源码+仿真)

目录 1、前言 2、仿真 3、程序 资料下载地址&#xff1a;基于MSP430F249的电子钟仿真(源码仿真&#xff09; 1、前言 基于MSP430F249的电子钟仿真&#xff0c;数码管显示时分秒&#xff0c;并可以通过按键调节时间。 2、仿真 3、程序 #include <MSP430x24x.h> #def…

Spring Boot项目中的ASCII艺术字

佛祖保佑&#xff1a; ${spring-boot.formatted-version} ———————————————————————————————————————————————————————————————————— // _ooOoo_ …

tomcat系统架构及运用

文章目录 下面是Tomcat架构的详细解析&#xff1a;1. **Server&#xff08;服务器&#xff09;**2. **Service&#xff08;服务&#xff09;**3. **Container&#xff08;容器&#xff09;** - 分层结构4. **Connectors&#xff08;连接器&#xff09;**5. **类加载器&#xff…

数据集笔记:处理北大POI 数据:保留北京POI

数据来源&#xff1a;Map POI (Point of Interest) data - Official data of the contest (pku.edu.cn) windows 下载方法&#xff1a;数据集笔记&#xff1a;windows系统下载北大开放数据研究平台的POI数据-CSDN博客 1 读取数据 1.1 列出所有的文件 dir1D:/data/PKU POI/2…

如何管理约束

本文主要介绍如何管理约束&#xff0c;包括决定何时发生约束检查&#xff0c;如何删除约束&#xff0c;删除和更新父行&#xff0c;插入和更新子行。 1. 约束事务模式 约束事务模式决定何时发生引用违例检查。 对于具有日志记录的数据库 — 即时约束&#xff08;Immediate con…

【笔试强训】Day4 --- Fibonacci数列 + 单词搜索 + 杨辉三角

文章目录 1. Fibonacci数列2. 单词搜索3. 杨辉三角 1. Fibonacci数列 【链接】&#xff1a;Fibonacci数列 解题思路&#xff1a;简单模拟题&#xff0c;要最少的步数就是找离N最近的Fibonacci数&#xff0c;即可能情况只有比他小的最大的那个Fibonacci数以及比他大的最小的那…

【VUE】Vue中实现树状表格结构编辑与版本对比的详细技术实现

Vue中实现树状表格结构编辑与版本对比的详细技术实现 在Vue中&#xff0c;创建一个可编辑的树状表格并实施版本对比功能是一种需求较为常见的场景。在本教程中&#xff0c;我们将使用Vue结合Element UI的el-table组件&#xff0c;来构建一个树状表格&#xff0c;其中包含添加、…

ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析

ICCV 2021 | FcaNet: Frequency Channel Attention Networks 中的频率分析 论文&#xff1a;https://arxiv.org/abs/2012.11879代码&#xff1a;https://github.com/cfzd/FcaNet 文章是围绕 2D 的 DCT 进行展开的&#xff0c;本文针对具体的计算逻辑进行梳理和解析。 f ( u ,…

【MySQL精炼宝库】数据库的约束 | 表的设计 | 聚合查询 | 联合查询

目录 一、数据库约束 1.1 约束类型&#xff1a; 1.2 案例演示&#xff1a; 二、表的设计 2.1 一对一: 2.2 一对多: 2.3 多对多: 2.4 内容小结&#xff1a; 三、新增 四、查询 4.1 聚合查询&#xff1a; 4.1.1 聚合函数&#xff1a; 4.1.2 GROUP BY子句&#xff1a…

linux使用docker 安装mysql redis

linux安装docker https://hub-stage.docker.com/ 前往这里搜索容器来部署。每个容器都有独立的运行环境。 具体安装教程 https://docs.docker.com/engine/install/centos/#install-using-the-repository 检查是否安装成功&#xff1a; sudo docker --version 配置国内镜像加速…