返回

用一种简单的方法解决 leetcode 2385:计算二叉树受感染所需时间

后端

LeetCode 2385:计算二叉树受感染所需时间

题目

给定一个根节点为 root 的二叉树和一个整数 initialValue,表示初始时病毒出现在 root 节点上。病毒会从根节点开始,以 1 秒的间隔逐个感染与之相邻的节点。受感染的节点会将病毒传播给相邻的节点,直至所有节点都被感染。

请你返回二叉树中所有节点都被感染所需要的最少时间。

示例 1:

输入:root = [1,2,3,4,5,6,7], initialValue = 0
输出:4

示例 2:

输入:root = [1], initialValue = 0
输出:0

示例 3:

输入:root = [1,2,3], initialValue = 1
输出:2

解法思路:

解决该问题,我们可以采用深度优先搜索算法来找到距离初始感染节点最远的节点,并通过广度优先搜索算法计算从初始感染节点到最远节点所需的时间。

  1. 首先,我们使用深度优先搜索算法对二叉树进行遍历,找到距离初始感染节点最远的节点。
  2. 然后,我们使用广度优先搜索算法从初始感染节点开始,逐层搜索二叉树,直到找到最远节点。
  3. 最终,我们将从初始感染节点到最远节点的路径长度作为二叉树中所有节点都被感染所需要的最少时间。

代码实现:

def amountOfTime(root, initialValue):
    """
    :type root: TreeNode
    :type initialValue: int
    :rtype: int
    """
    # 使用深度优先搜索算法找到距离初始感染节点最远的节点
    max_depth = 0
    farthest_node = None

    def dfs(node, depth):
        nonlocal max_depth, farthest_node
        if not node:
            return

        if depth > max_depth:
            max_depth = depth
            farthest_node = node

        dfs(node.left, depth + 1)
        dfs(node.right, depth + 1)

    dfs(root, 0)

    # 使用广度优先搜索算法计算从初始感染节点到最远节点所需的时间
    visited = set()
    queue = [(root, 0)]

    while queue:
        node, depth = queue.pop(0)

        if node == farthest_node:
            return depth

        if node.left and node.left not in visited:
            queue.append((node.left, depth + 1))
            visited.add(node.left)

        if node.right and node.right not in visited:
            queue.append((node.right, depth + 1))
            visited.add(node.right)

时间复杂度分析:

该解法的复杂度主要由深度优先搜索和广度优先搜索的时间复杂度决定。深度优先搜索的时间复杂度为 O(N),广度优先搜索的时间复杂度为 O(N),因此该解法的总时间复杂度为 O(N)。

空间复杂度分析:

该解法需要使用深度优先搜索和广度优先搜索算法,因此空间复杂度为 O(N)。