LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】

  • 题目描述:
  • 解题思路一:记录父节点 + DFS
  • 解题思路二:
  • 解题思路三:深度优先搜索建图 + 广度优先搜索求感染时间【最容易理解】

题目描述:

给你一棵二叉树的根节点 root ,二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟,感染 将会从值为 start 的节点开始爆发。

每分钟,如果节点满足以下全部条件,就会被感染:

节点此前还没有感染。
节点与一个已感染节点相邻。
返回感染整棵树需要的分钟数。

示例 1:
在这里插入图片描述
输入:root = [1,5,3,null,4,10,6,9,2], start = 3
输出:4
解释:节点按以下过程被感染:

  • 第 0 分钟:节点 3
  • 第 1 分钟:节点 1、10、6
  • 第 2 分钟:节点5
  • 第 3 分钟:节点 4
  • 第 4 分钟:节点 9 和 2
    感染整棵树需要 4 分钟,所以返回 4 。
    示例 2:
    在这里插入图片描述
    输入:root = [1], start = 1
    输出:0
    解释:第 0 分钟,树中唯一一个节点处于感染状态,返回 0 。

提示:

树中节点的数目在范围 [1, 105] 内
1 <= Node.val <= 105
每个节点的值 互不相同
树中必定存在值为 start 的节点

解题思路一:记录父节点 + DFS

设 v 是离 start 最远的节点,返回 start 到 v 的距离。例如示例 1 中节点 9(或者节点 2)离 start=3 最远,二者距离为 4。

在这里插入图片描述
这里不想使用nonlocal可以使用列表

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:fa = {}start_node = [None]def dfs(node, from_):if node is None:returnfa[node] = from_ # 记录每个节点的父节点if node.val == start: # 找到 start# nonlocal start_nodestart_node[0] = nodedfs(node.left, node)dfs(node.right, node)dfs(root, None)def maxDepth(node, from_):if node is None:return -1 # 注意这里是 -1,因为 start 的深度为 0return max(maxDepth(x, node) for x in (node.left, node.right, fa[node]) if x != from_) + 1return maxDepth(start_node[0], start_node[0])

时间复杂度:O(n)
空间复杂度:O(n)

解题思路二:

在这里插入图片描述

class Solution:def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:ans = 0def dfs(node: Optional[TreeNode]) -> (int, bool):if node is None:return 0, Falsel_len, l_found = dfs(node.left)r_len, r_found = dfs(node.right)nonlocal ansif node.val == start:# 计算子树 start 的最大深度# 注意这里和方法一的区别,max 后面没有 +1,所以算出的也是最大深度ans = max(l_len, r_len)return 1, True  # 找到了 startif l_found or r_found:# 只有在左子树或右子树包含 start 时,才能更新答案ans = max(ans, l_len + r_len)  # 两条链拼成直径# 保证 start 是直径端点return (l_len if l_found else r_len) + 1, Truereturn max(l_len, r_len) + 1, Falsedfs(root)return ans

时间复杂度:O(n)
空间复杂度:O(n)

解题思路三:深度优先搜索建图 + 广度优先搜索求感染时间【最容易理解】

根据题意,需求出值为 start 的节点到其他节点最远的距离。树中的最远距离可以用广度优先搜索来求解。但是 start 不一定为根节点,我们需要先将树的结构用深度优先搜索解析成无向图,再用广度优先搜索来求最长距离。代码中 graph 即为邻接表,用一个哈希表来表示。哈希表的键为节点值,值为其相邻节点的值组成的列表。建完表后用广度优先搜索求最长距离。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:def amountOfTime(self, root: Optional[TreeNode], start: int) -> int:graph = collections.defaultdict(list)def dfs(node):for child in [node.left, node.right]:if child:graph[child.val].append(node.val)graph[node.val].append(child.val)dfs(child)dfs(root)q = deque([[start, 0]])visited = set([start])time = 0while q:nodeVal, time = q.popleft()for childVal in graph[nodeVal]:if childVal not in visited:q.append([childVal, time + 1])visited.add(childVal)return time

时间复杂度:O(n)
空间复杂度:O(n)


创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)
欢迎大家关注笔者,你的关注是我持续更博的最大动力


原创文章,转载告知,盗版必究



在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

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

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

相关文章

Python 将Influxdb时序数据写入mysql库时遇到的问题

使用python的 influxdb、pandas、pymysql模块&#xff0c;将influxdb的时序数据&#xff0c;抽取到myl中。 使用influxdb模块中的DataframeClient初始化一个连接实例&#xff0c;然后通过实例的quey()方法&#xff0c;执行influxQL查询&#xff0c;查询需要的数据&#xff0c;…

springboot如何返回中文json,保证顺序。LinkedHashMap应用实例

在业务中有时候需要中文json去进行映射到有些UI上&#xff0c;而springboot都是英文字段 //通过id查询消火栓的基本信息和检测值给POIGetMapping("/queryPOIForHydrant")ApiOperationSupport(order 4)ApiOperation(value "查询所需要的消火栓数据渲染给POI&qu…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑&#xff0c;判断对象类型是否是InitializingBean的子类型&#xff0c;如果是&#x…

FRP远程连接

前言 通过frp和跳板机完成局域网服务器访问。工具地址&#xff1a;https://github.com/fatedier/frp 配置frp过程 下载frp工具&#xff0c;下载地址如下&#xff1a; https://github.com/fatedier/frp/releases 这里我选择了v0.57.0 解压到本地路径 tar -zxvf xxxxxx.tar.gz配…

python爬虫学习第二十八天-------了解scrapy(二十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

接口测试和Mock学习路线(中)

1.什么是 swagger Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。 通俗的来讲&#xff0c;Swagger 就是将项目中所有想要暴露的接口展现在页面上&#xff0c;并且可以进行接口调用和测试的服务。 现在大部分的项目都使用了 swagger&#xff0c;因为这样后端…

有哪些强化学习的算法以及它们的原理及优缺点

强化学习是一种机器学习方法&#xff0c;其目标是设计智能体&#xff08;agent&#xff09;&#xff0c;使其能够通过与环境的交互学习最优的行为策略。下面将介绍几种主要的强化学习算法&#xff0c;包括Q-Learning、Deep Q-Network&#xff08;DQN&#xff09;、Policy Gradi…

C语言如何进⾏指针运算?

一、问题 普通变量可以运算&#xff0c;那么指针可以吗&#xff1f;答案是肯定的。那么如何运算呢&#xff0c;下⾯就来介绍⼀下。 二、解答 我们知道可以利⽤指针⽅便地对数组元素进⾏⽐较和查找&#xff0c;那么这就需要对指针进⾏运算。 &#xff08;1&#xff09;⾃增/⾃…

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

redis单线程模型

工作原理 在Redis中&#xff0c;当两个客户端同时发送相同的请求时&#xff0c;Redis采用单线程模型来处理所有的客户端请求&#xff0c;会依次处理这些请求&#xff0c;每个请求都会按照先后顺序被执行&#xff0c;不会同时处理多个请求。使得Redis能够避免多线程并发访问数据…

大语言模型应用指南:以ChatGPT为起点,从入门到精通的AI实践教程

目录 前言ChatGPT问世和发展展望未来大语言模型应用指南 特点大语言模型应用指南 主要内容 前言 在20世纪末和21世纪初&#xff0c;人类经历了两次信息革命的浪潮。 第一次是互联网时代的兴起&#xff0c;将世界各地连接在一起&#xff0c;改变了人们获取信息和交流的方式。 …

Nobe.js的安装与配置

1. **下载**&#xff1a;访问Node.js官网&#xff0c;选择适合自己操作系统的安装包进行下载。 2. **安装**&#xff1a;双击下载好的安装包并按照提示进行安装。在安装过程中&#xff0c;可以选择自定义安装路径&#xff0c;并确保勾选接受许可协议。 3. **环境变量配置**&…

函数式接口及Stream流式计算

一、什么是函数式接口 只有一个方法的接口&#xff0c;例如 FunctionalInterface public interface Runnable { public abstract void run(); }二、Function函数式接口&#xff1a;有一个输入参数&#xff0c;有一个输出 三、断定型接口&#xff1a;有一个输入参数&#xf…

YOLO如何入门?

入门 YOLO 目标检测算法&#xff0c;你可以遵循以下步骤&#xff1a; 1. 理解目标检测的基本概念&#xff1a;了解目标检测在计算机视觉中的作用&#xff0c;以及它如何帮助识别和定位图像中的对象。 2. 学习基础的机器学习和深度学习知识&#xff1a;熟悉基础的机器学习算法…

使用rsync建立MySQL从节点

使用场景&#xff1a;MySQL主节点存储较大&#xff0c;使用xtrabackup会遇到异常的情况 前置条件&#xff1a;node-01 与 node-02 做过ssh互信&#xff0c;rsync客户端均已安装&#xff0c;主节点开启binlog node-01 原主节点&#xff0c;数据存放目录为 /var/lib/mysql node-0…

Bin-什么是wafer sorting及相关方案

在半导体行业中,"wafer分bin"(或称为wafer sorting)是指根据晶圆上的芯片在测试过程中的性能参数,将它们分类到不同的性能等级或"bin"中。这个过程对于确保最终产品的性能和质量至关重要。以下是wafer分bin业务的介绍和相关方案: 01、业务介绍: 1. …

语音驱动AI人脸动画

目录 audio2face FaceFormer 语音驱动 3D人脸动画 MODA 基于人脸关键点的语音驱动单张图数字人生成&#xff08;ICCV2023&#xff09; sadTalker 从音频中生成3DMM的头部姿势和表情 Media2Face 还没开源 audio2face https://github.com/FACEGOOD/FACEGOOD-Audio2Face/tr…

《ElementPlus 与 ElementUI 差异集合》el-select 显示下拉列表在 Cesium 场景中无法监听关闭

前言 仅在 Element UI 时有此问题&#xff0c;Element Plus 由于内部结构差异较大&#xff0c;不存在此问题。详见《el-select 差异点&#xff0c;如&#xff1a;高、宽、body插入等》&#xff1b; 问题 点击空白处&#xff0c;下拉列表可监听并关闭&#xff1b;但在 Cesium…

【js】解决自动生成颜色时相邻颜色视觉相似问题的技术方案

解决自动生成颜色时相邻颜色视觉相似问题的技术方案 在进行大规模颜色生成时&#xff0c;特别是在数据可视化、用户界面设计等应用领域&#xff0c;一个常见的挑战是确保相邻颜色在视觉上具有足够的区分度。本文介绍的方法通过结合黄金分割比与饱和度、亮度的周期性变化&#…