题目
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
示例
输入:
3
/ \
9 20
/ \
15 7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
注意:
- 节点值的范围在32位有符号整数范围内。所以就不用考虑小数了。
解法
一、广度优先遍历( Python )
class Solution:
def averageOfLevels(self, root: TreeNode) -> List[float]:
if root == None:
return []
stack = [root]
res = []
while stack:
level_sum = 0
k = 0
next_stack = []
for node in stack:
if node:
level_sum += node.val
k += 1
next_stack.append(node.left)
next_stack.append(node.right)
stack = next_stack
if k:
res.append(level_sum / k)
return res
基本思路
利用广度优先遍历,遍历每一层所有节点,累计节点数量以及总值,最后计算平均值。
复杂度分析
时间复杂度为 O ( N ) O \left( N\right) O(N),空间复杂度为 O ( m ) O \left( m\right) O(m), m m m表示节点数最多的一层的节点的数量。
二、深度优先遍历 (Python)
def averageOfLevels(self, root):
info = []
def dfs(node, depth = 0):
if node:
if len(info) <= depth:
info.append([0, 0])
info[depth][0] += node.val
info[depth][1] += 1
dfs(node.left, depth + 1)
dfs(node.right, depth + 1)
dfs(root)
return [s/float(c) for s, c in info]
基本思路
实现DFS的关键在于**depth
参数的使用**。info
里的每一个子列表,都含有两个元素,一个是该层的节点值之和,另一个是该层的深度。当到达下一层时,在info
中加入一个新的子列表,用于记录该层的信息。
复杂度分析
时间复杂度为
O
(
N
)
O \left( N \right)
O(N)。空间上用了一个info
,其大小为二叉树深度
H
H
H的两倍,另外递归同样需要大小为
H
H
H的空间,所以空间复杂度为
O
(
H
)
O \left( H\right)
O(H)。