题目:
给你一棵二叉树的根节点 root ,二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟,感染 将会从值为 start 的节点开始爆发。
每分钟,如果节点满足以下全部条件,就会被感染:
节点此前还没有感染。
节点与一个已感染节点相邻。
返回感染整棵树需要的分钟数。
思路:
在dfs过程中,使用一个字典记录每个节点的父节点,以方便后续遍历;同时碰到节点值为start时,需要记录该节点。方便后续初始化。
解答:
# 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:
parents={}
def dfs(node,pa):
if not node:
return
if node.val==start:
self.start=node
parents[node]=pa
dfs(node.left,node)
dfs(node.right,node)
dfs(root,None)
vis={None,self.start}
q=[self.start]
res=-1
while q:
res+=1
tmp=q
q=[]
for cur in tmp:
for node in cur.left,cur.right,parents[cur]:
if node not in vis:
vis.add(node)
q.append(node)
return res