【题目】
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 1:
输入:
3
/
9 20
/
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
提示:
节点值的范围在32位有符号整数范围内。
【代码】
【BFS】借助模拟队列
# 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 averageOfLevels(self, root: TreeNode) -> List[float]:
queue=[root]
ans=[]
while queue:
size=len(queue)
temp_sum=0
for i in range(size):
node=queue.pop(0)
temp_sum+=node.val
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
ans.append(temp_sum/size)
return ans
【递归】共享变量,统计同一层次的结点
# 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 averageOfLevels(self, root: TreeNode) -> List[float]:
self.depth=dict()
self.visit(root,0)
return [sum(self.depth[x])/len(self.depth[x]) for x in self.depth]
def visit(self,root,depth):
if not root:
return depth
self.depth[depth]=self.depth.setdefault(depth,[])
self.depth[depth].append(root.val)
self.visit(root.left,depth+1)
self.visit(root.right,depth+1)
【递归2】
class Solution:
def averageOfLevels(self, root: TreeNode) -> List[float]:
def dfs(root: TreeNode, level: int):
if not root:
return
if level < len(totals):
totals[level] += root.val
counts[level] += 1
else:
totals.append(root.val)
counts.append(1)
dfs(root.left, level + 1)
dfs(root.right, level + 1)
counts = list()
totals = list()
dfs(root, 0)
return [total / count for total, count in zip(totals, counts)]