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

news2024/11/24 18:37:58

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.coloradmin.cn/o/1626250.html

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

相关文章

【静态分析】静态分析笔记08 - 指针分析 - 上下文敏感

参考: 【课程笔记】南大软件分析课程8——指针分析-上下文敏感(课时11/12) - 简书 ------------------------------------------------------------------------------------------------------------- 1. 上下文不敏感的问题 说明&#…

最详细步骤解决:Apps targeting Android12 and higher are required to specify...

问题原因: 当targetSdkVersion>31时,需要在AndroidManifest.xml中配置android:exported的值,该值为boolean类型。 android:exported解释: activity 是否可由其他应用的组件启动: 如果设为 "true"&#…

python中开发页面的两种方法:Qt Designer(PyQt图形化界面拖拽开发App界面)以及Django(开发Web应用框架)

一、开发独立的窗口,App的那种,可使用tkinter或者PyQt 使用PyQt时,里面有个工具Qt Designer,是一个可视化的界面设计工具,可以通过拖拽等方式来设计界面。下面就是Qt Designer的操作界面: 参考链接如下&am…

Linux——web建立wordpress

下载 [rootnfs-server ~]# yum install php wget https://wordpress.org/latest.tar.gz解压 /var/www/html [rootnfs-server html]# tar -xzvf latest.tar.gz [rootnfs-server html]# rm latest.tar.gz授权 [rootnfs-server html]# chown -R www:www /var/www/html添加文件备…

智能解决装箱问题:使用优化算法实现高效包装

组合优化问题 组合优化(Combinatorial Optimization,CO)数学优化研究的一个分支。主要关注的是从有限的对象集合中寻找最优解的问题。这个词的由来主要是由“组合”和“优化”两部分构成。“组合”指的是从有限的对象集合中选择一部分的过程…

1-内核开发环境ubuntu+virtualbox+mobaXterm搭建

内核开发环境 ubuntuvirtualboxmobaXterm搭建 目录 内核开发环境 ubuntuvirtualboxmobaXterm搭建 1.virtualbox 安装 2.ubuntu 安装 3.网络设置 4.虚拟机安装ssh 服务,更新ubuntu 源安装基本软件 5.mobaXterm 个人免费版本安装 6.总结 本课程教程从0-1开始教…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池?为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

为什么 React 比 Vue 难?你不知道的前端简史!

CSDN里有一个女粉问我,为什么都在说 React 比 Vue 难? 事实上,我不知道这个说法算是客观事实呢,还是“思想钢印”。 但是我第一反应就是盲猜一手,“React 比 Vue 难”这个说法可能源于后端攻城狮的主观评价,因为传统…

华为Pura 70系列,一种关于世界之美的可能

1874年,莫奈创作了《印象日出》的油画,在艺术界掀起了一场革命。当时的主流艺术,是追求细节写实,追求场面宏大的学院派。他们称莫奈等人是“印象派”,认为莫奈的画追求光影表达,追求描绘抽象的意境&#xf…

Oracle正則匹配練習一

1.使用分割符號 select regexp_substr(A_B_C, [^_], 1, 2) FROM DUAL 2.練習2 SELECT SUBSTR(path_string, INSTR(path_string, \, -1, 2) 1, INSTR(path_string, \, -1) - INSTR(path_string, \, -1, 2) - 1) AS extracted_string FROM (SELECT D:\SKY Image\A0-BOTC8…

一个VUE3的页面demo

样子是这样的 目录是这样的 index.vue文件内容 <template><div class"app-container"><div class"content"><div class"form" v-show"showSearch"><el-formref"queryRef":inline"true&qu…

C语言笔试题之找出数组的最大公约数

找出数组的最大公约数 实例要求 1、给定一个整数数组 &#xff0c;返回数组中最大数和最小数的最大公约数&#xff1b;2、两个数的最大公约数是能够被两个数整除的最大正整数&#xff1b;示例&#xff1a; 实例分析 1、要找到数组中最大数和最小数的最大公约数&#xff1b…

Python3.11修改并运行oneforall

遇到的问题 使用python3.11默认无法运行oneforall脚本&#xff0c;出现如下报错 # 解决方案 修改 /usr/local/lib/python3.11/dist-packages/exrex.py exrex.py具体文件路径报错中会显示 vim /usr/local/lib/python3.11/dist-packages/exrex.py# 修改前 from re import sre…

02_c/c++开源库ZeroMQ

1.安装 C库 libzmq sudo apt install libzmq3-dev 实例: https://zeromq.org/get-started/?languagec&librarylibzmq# 编译依赖: pkg-config --cflags --libs libzmq or cat /usr/lib/x86_64-linux-gnu/pkgconfig/libzmq.pc -isystem /usr/include/mit-krb5 -I/usr/in…

Magnet for Mac:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具&#xff0c;旨在帮助用户更高效地管理和布局多个应用程序窗口&#xff0c;提升工作效率。 Magnet for Mac v2.14.0中文免激活版下载 这款软件拥有直观易用的界面和丰富的功能&#xff0c;支持用户将屏幕分割成多个区域&…

低代码将干掉65%软件开发工作:留给码农的时间不多了

IDC预测&#xff0c;到2024年&#xff0c;约有65%的应用软件将通过低代码开发方式实现&#xff0c;同样&#xff0c;Gartner也曾发布过类似的预测&#xff0c;结果与IDC的预测大致相符。 低代码领域的知名公司Mendix之前发布的一份调研报告指出&#xff1a; “在中国&#xf…

基于Python实现的推箱子小游戏

Python贪吃蛇小游戏实现: 推箱子曾经在我们的童年给我们带来了很多乐趣。推箱子这款游戏现在基本上没人玩了&#xff0c;甚至在新一代人的印象中都已毫无记忆了。。。但是&#xff0c;这款游戏可以在一定程度上锻炼自己的编程能力。 运行效果如图所示&#xff1a; 游戏关卡有点…

C# 生成图形验证码

目录 应用场景 开发运行环境 设计 生成内容 生成图片 实现 核心代码 调用示例 小结 应用场景 我们当用户登录系统时经常会用到图形验证码技术&#xff0c;要求用户识别图片中的内容&#xff0c;并正确输入&#xff0c;方可尝试登录。类似的场景还有用户注册或者涉及…

探秘MySQL主从复制的多种实现方式

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘MySQL主从复制的多种实现方式 前言基于语句的复制原理实现方法应用场景及优缺点应用场景优点缺点 基于行的复制原理实现方法优势和适用性优势适用性 基于混合模式的复制混合模式复制的工作原理混合…

【stomp 实战】Spring websocket使用详解和基本原理

spring框架对websocket有很好的支持&#xff0c;stomp协议作为websocket的子协议&#xff0c;Spring也做了很多封装&#xff0c;让我们在开发中易于使用。 学习使用Spring的Websocket模块&#xff0c;当然最好的办法就是看官网说明了。本篇文章对官网做一些简述和个人的理解。 …