首页 > 其他分享 >【每日一题】感染二叉树需要的总时间

【每日一题】感染二叉树需要的总时间

时间:2024-04-30 12:22:18浏览次数:20  
标签:node val 每日 感染 start 二叉树 节点

2385. 感染二叉树需要的总时间

给你一棵二叉树的根节点 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 的节点

这道题本质上就是求start节点到树中其他节点的最远距离,本来的想法是最远节点要么是start节点继续向下走,走到的最深节点;要么是start节点往上走,某处拐弯后再到另一边子树的最深节点。据说这叫求二叉树的直径。

但是start这里给出的只不过是一个值而已,所以要找到start节点在树中的位置就得花一番工夫,包括找到“拐弯”总觉得有点麻烦。

常规解法还是先将树的结构用深度优先搜索解析成无向图,再用广度优先搜索来求最长距离。代码中graph为邻接表,用一个哈希表来表示,哈希表的键为节点值,值为其相邻节点的值组成的列表。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def amountOfTime(self, root, start):
        """
        :type root: Optional[TreeNode]
        :type start: int
        :rtype: int
        """
        # 本质上就是计算start节点到其他节点的最远距离
        # 用dfs把树的结构解析成无向图,用邻接表存储
        graph = defaultdict(list) 
        def dfs(node):
            for child in [node.left, node.right]:
                if child:
                    graph[node.val].append(child.val)
                    graph[child.val].append(node.val)
                    dfs(child)
        dfs(root)

        # 用bfs求最长距离
        q = deque([(start, 0)])  # (node, infection time)
        visited = set([start])
        time = 0
        while 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)O(n),其中 nnn 是树的节点个数。

  • 空间复杂度:O(n)O(n)O(n)。

标签:node,val,每日,感染,start,二叉树,节点
From: https://www.cnblogs.com/Aikoin/p/18167812

相关文章

  • 二叉树笔试题解题思路
    数据结构二叉树笔试题:解题思路:1.判断是否为空树,若为空树,则返回0;2.定义两个指针备份根结点地址,定义两个整型变量a,b并初始化为0,记录左右子树的深度;先对根结点的左子树进行遍历,若根结点的左结点不为NULL,则a++,把根结点的左结点赋值为新的根结点,再进行上述操作,若根结点的左结点......
  • 数据结构-二叉树的初始化
    数据结构-二叉树的相关初始化/*************************************************/***@filename: DcirLLinkInsert*@brief对双向循环链表插入的功能实现*@[email protected]*@date2024/04/29*@version1.0:在下坂本,有何贵干*@property:none......
  • 后端每日一题 2:DNS 解析过程
    本文首发于公众号:腐烂的橘子本文梗概:DNS是什么,有什么作用一条DNS记录是什么样的DNS域名解析原理DNS服务器如何抵御攻击DNS是什么,有什么作用DNS(DomainNameSystem)是一种应用层协议,用于映射域名和ip地址。为什么要做映射呢?就像可以用身份证号来对应一个人,也可......
  • 后端每日一题 1:说一下三次握手
    本文首发于公众号:腐烂的橘子三次握手的流程第1步-初始连接请求SYN(Synchronize)服务端状态LISTEN,客户端向服务端发送一个SYN标志位的报文段(TCPsegment)这个报文段包含初始序列号x,以及最大报文段大小等字段客户端发送报文后,状态设置为SYN_SEND第2步-服务端回......
  • 【每日一题】爱生气的书店老板
    1052.爱生气的书店老板有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。给定一个长度为n的整数数组customers,其中customers[i]是在第i分钟开始时进入商店的顾客数量,所有这些顾客在第i分钟结束后离开。在某些时候,书店老板会生气。如果书店老......
  • 【每日一题】组合总和 Ⅳ
    377.组合总和Ⅳ给你一个由不同整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合32位整数范围。示例1:输入:nums=[1,2,3],target=4输出:7解释:所有可能的组合为:(1,1,1,1)(1,1,2......
  • 已知二叉树的先序和后序求任意一中序
    假设一个二叉树上所有结点的权值都互不相同。我们可以通过后序遍历和中序遍历来确定唯一二叉树。也可以通过前序遍历和中序遍历来确定唯一二叉树。但是,如果只通过前序遍历和后序遍历,则有可能无法确定唯一二叉树。现在,给定一组前序遍历和后序遍历,请你输出对应二叉树的中序遍历......
  • 已知二叉树的前序和中序遍历求后序遍历
    假设二叉树上各结点的权值互不相同且都为正整数。给定二叉树的前序遍历和中序遍历,请你输出二叉树的后序遍历序列。输入格式第一行包含整数N,表示二叉树结点总数。第二行给出二叉树的前序遍历序列。第三行给出二叉树的中序遍历序列。输出格式输出二叉树的后序遍历的第一个数......
  • 已知二叉树的后序和中序遍历求前序遍历
    假设二叉树上各结点的权值互不相同且都为正整数。给定二叉树的后序遍历和中序遍历,请你输出二叉树的前序遍历的最后一个数字。输入格式:第一行包含整数N,表示二叉树结点总数。第二行给出二叉树的后序遍历序列。第三行给出二叉树的中序遍历序列。输出格式输出二叉树的前序遍......
  • 二叉树深度的题目
    #这是一道关于二叉树深度的题目。题目要求我们输入一个二叉树的结点数和每个结点的左右子结点编号,然后输出这棵二叉树的最大深度。#对于这个问题,我们可以使用递归的方法来求解。以下是一个Python的代码示例: depth=1defdfs(node,depth):ifnode==0:retu......