想法:
题目要求我们每一层每一层的遍历,所以可以想到使用广度优先算法,并且需要用到两个队列。
我们可以利用collections library里面的deque建立queue,用于进行广度优先遍历。因为这道题目要求我们计算每一层的总和,所以我们需要建立第二个queue,储存下一层的node。
# 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
from collections import deque
class Solution:
def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
if not root.left and not root.right:
return [root.val]
q = deque([root])
res = []
while q:
sum1 = 0
cnt = 0
#tmp用于记录下一层的nodes。
tmp = deque([])
#现在的q里面只包含其中一层的node
while q:
#把每一个node都取出来,计算它们的总和,并记录个数。
node = q.popleft()
sum1 = sum1 + node.val
cnt += 1
#如果有左子节点或右子节点,把它们放在tmp里面。
if node.left:
tmp.append(node.left)
if node.right:
tmp.append(node.right)
#把tmp赋值给q,这样q就储存了下一层的nodes,while loop继续。
q = tmp
#计算这一层的平均值。
average = (sum1 * 1.00000 / cnt)
res.append(average)
return res