给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array.
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
思路:广度优先搜索/队列
leetcode 官方题解
Python:
def averageOfLevels(self, root):
"""
:type root: TreeNode
:rtype: List[float]
"""
'''
ans = {}
def dfs(root, depth):
if not root:
return
if depth not in ans.keys():
ans[depth] = [root.val]
else:
ans[depth].append(root.val)
dfs(root.left, depth+1)
dfs(root.right, depth+1)
dfs(root, 0)
res = [sum(i)/float(len(i)) for i in ans.values()]
return res
'''
det = []
if not root: return []
q = collections.deque([root])
while len(q) > 0:
sz = len(q)
s = 0.0
for _ in range(sz):
tmp = q.popleft()
s += tmp.val
if tmp.left is not None: q.append(tmp.left)
if tmp.right is not None: q.append(tmp.right)
det.append(s/sz)
return det
C++:
vector<double> averageOfLevels(TreeNode* root) {
vector<double> det;
if (!root) return {};
queue q{deque{root}};
while (!empty(q))
{
int sz = size(q);
double sum = 0;
for (int i = 0; i != sz; ++i)
{
auto [val, left, right] = *q.front();
q.pop();
sum += val;
if (left) q.push(left);
if (right) q.push(right);
}
det.emplace_back(sum/sz);
}
return det;
}