面试经典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.mzph.cn/web/4176.shtml

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

相关文章

k8s部署prometheus

部署pvc 修改nfs-deployment.yaml文件中的信息&#xff0c;然后应用YAML文件 cat > /opt/k8s/prometheus/prometheus-pvc.yaml <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata:name: prometheus-data-pvc spec:accessModes:- ReadWriteManystorageClas…

京东天幕,宙斯,云鼎什么关系

京东云鼎是京东云推出的一站式零售应用云计算平台&#xff0c;为商家、品牌商及合作伙伴与京东无界赋能的商业赋能、业务赋能、品牌赋能等服务集成&#xff0c;提供弹性的云计算资源、可靠的安全服务、高效的数据推送服务、标准化的网关服务&#xff0c;并优先享受京东的云端生…

手把手教数据结构与算法:栈的应用(平衡符号和简单计算器)

栈 基本概念 栈的定义 栈&#xff08;Stack&#xff09;&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 栈顶&#xff08;Top&#xff09;&#xff1a;线性表允许进行插入删除的那一端…

@Value

Value 注解是 Spring 框架中的一个注解&#xff0c;用于从属性文件、环境变量、Java 系统属性等地方读取值&#xff0c;并将这些值注入到 Spring 管理的 Bean 中。 Component public class MyBean {Value("${my.property}")private String myProperty;// Getter and…

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

debian gnome-desktop GUI(图形用户界面)系统

目录 &#x1f31e;更新 &#x1f3a8;安装 &#x1f34e;分配 &#x1f6cb;️重启 &#x1f511;通过VNC连接 debian gnome-desktop &#x1f31e;更新 sudo apt update sudo apt -y upgrade &#x1f3a8;安装 sudo apt -y install task-gnome-desktop 这个过程比…

前端发版缓存问题

前端发版后浏览器缓存问题 浏览器缓存机制是为了提高网页加载速度和减少带宽消耗而设计的。当浏览器访问一个资源时&#xff0c;它会首先检查该资源是否已经在缓存中。如果资源存在且未过期&#xff0c;浏览器会直接从缓存中加载资源&#xff0c;而不会向服务器发送请求。这种…

pytest-asyncio:协程异步测试案例

简介&#xff1a;pytest-asyncio是一个pytest插件。它便于测试使用异步库的代码。具体来说&#xff0c;pytest-asyncio提供了对作为测试函数的协同程序的支持。这允许用户在测试中等待代码。 历史攻略&#xff1a; asyncio并发访问websocket Python&#xff1a;协程 - 快速创…

ROS1快速入门学习笔记 - 06订阅者Subscriber的实现

一、话题模型&#xff08;发布/订阅&#xff09; 二、 实现步骤 与发布者步骤类似&#xff0c;我们将发布者的对应代码写入功能包的src文件中。 1. C程序代码 /*********************************************************************** Copyright 2020 GuYueHome (www.guyu…

SpringBoot学习之SpringBoot3集成OpenApi(三十八)

Springboot升级到Springboot3以后,就彻底放弃了对之前swagger的支持,转而重新支持最新的OpenApi,今天我们通过一个实例初步看看OpenApi和Swagger之间的区别. 一、POM依赖 我的POM文件如下,仅作参考: <?xml version="1.0" encoding="UTF-8"?>…

Openharmony - 设备异常关机Power Down问题分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 1.问题描述1.1出现power down的原因1.1.1硬件故障或信号1.1.2软件错误或系统崩溃2.抓日志信息2.1.抓日志方法2.2.问题初步分析3.问题排…

商城数据库(49-52)

49——订单ID表&#xff08;wang_orderids&#xff09; CREATE TABLE wang_orderids (id bigint(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,rnd float(16,2) NOT NULL COMMENT 毫秒数,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COMMENT订单ID表; 50——订单表…

第三方登录以及微信小程序一键登录的实现方案

文章目录 场景解决 场景 第三方登录以及微信小程序一键登录的实现方案, 作下记录 解决 第三方登录 JustAuth微信小程序一件登录 wxjava

【数据结构与算法】:手搓顺序表(Python篇)

文章目录 一、顺序表的概念二、顺序表的实现1. 顺序表的创建1.1 扩容1.2 整体建立顺序表 2. 顺序表的基本运算算法2.1 顺序表的添加&#xff08;尾插&#xff09;2.2 指定位置插入2.3 指定位置删除2.4 顺序表的查找2.5 顺序表元素的索引访问2.6 顺序表元素的修改2.7 顺序表长度…

《Kafka 3.x.x 入门到精通》

Kafka 3.x.x 入门到精通 Kafka是一个由Scala和Java语言开发的&#xff0c;经典高吞吐量的分布式消息发布和订阅系统&#xff0c;也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐&#xff0c;低延迟&#xff0c;高伸缩&#xff0c;高可靠性&#xff0c;高并发&#x…

两大成果发布!“大规模量子云算力集群”和高性能芯片展示中国科技潜力

在当前的科技领域&#xff0c;量子计算的进步正日益引起全球的关注。中国在这一领域的进展尤为显著&#xff0c;今天&#xff0c;北京量子信息科学研究院&#xff08;以下简称北京量子院&#xff09;和中国科学院量子信息与量子科技创新研究院&#xff08;以下简称量子创新院&a…

微信小程序:8.WXSS

WXSS和CSS的关系 WXSS具有CSS大部分特性&#xff0c;同时&#xff0c;WXSS还对CSS进行扩充以及修改&#xff0c;适应微信小程序的开发。 与CSS相比&#xff0c;WXSS扩展的特性有&#xff1a; rpx尺寸单位imprt样式导入 rpx尺寸单位 rpx是微信小程序中独有的&#xff0c;用来…

Node.js在前端的妙用:打造更出色的Web体验

在Web开发领域&#xff0c;Node.js早已成为一种不可或缺的技术。尽管Node.js最初是作为服务器端技术而闻名&#xff0c;但是在前端开发中&#xff0c;它同样有着令人惊叹的应用。本文将探讨Node.js在前端的各种用途&#xff0c;并展示如何利用它来提升Web应用的性能、可维护性和…

Vue 使用Canvas画布手写电子版签名 保存 上传服务端

电子版签名效果 定义画布 <canvas width"500"height"250"ref"cn"mousedown"cnMouseDown"mousemove"cnMouseMove"mouseup"cnMouseUp"style"width:500px;height: 250px;background-color:snow;padding: 10p…

在Docker中部署Java应用:Java版本隔离的实践案例

在Docker中部署Java应用&#xff1a;Java版本隔离的实践案例 人生就是一场又一场的相遇&#xff0c;一个明媚&#xff0c;一个忧伤&#xff0c;一个华丽&#xff0c;一个冒险&#xff0c;一个倔强&#xff0c;一个柔软&#xff0c;最后那个正在成长。 背景需求 在软件开发和部…