题目
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
注意:
节点值的范围在32位有符号整数范围内。
分析
有两种解法:第一种,使用层序遍历得到每一层的List,然后遍历List得到结果即可.不过这种方法比较慢
第二种,使用父子队列,当父队列全部出队,就计算平均值,子队列新的新的父队列继续遍历,新的子队列则指向一个新的对象并在遍历的同时使节点的子节点进队.也很慢
代码
第一种解法:
/**
* 土鳖做法1
* @param root
* @return
*/
public List<Double> averageOfLevels(TreeNode root) {
List<Double> result = new ArrayList<>();
List<List<Integer>> list = new ArrayList<>();
levelsOrder(root, 0, list);
for (List<Integer> integers : list) {
System.out.println(integers);
long sum = 0;
for (Integer integer : integers) {
sum = sum + integer;
}
System.out.println(sum);
result.add(sum * 1.0 / integers.size());
}
return result;
}
private void levelsOrder(TreeNode node, int depth, List<List<Integer>> result) {
if (node == null) {
return;
}
if (depth + 1 > result.size()) {
result.add(new ArrayList<>());
}
result.get(depth).add(node.val);
levelsOrder(node.left, depth + 1, result);
levelsOrder(node.right, depth + 1, result);
}
解法2:
/**
* 土鳖做法2
* @param root
* @return
*/
public List<Double> averageOfLevels2(TreeNode root) {
List<Double> result = new ArrayList<>();
Queue<TreeNode> parentQueue = new LinkedList<>();
Queue<TreeNode> sonQueue = new LinkedList<>();
parentQueue.offer(root);
int count = 0;
long sum = 0L;
while (!parentQueue.isEmpty()) {
TreeNode cur = parentQueue.poll();
if(cur.left != null){
sonQueue.offer(cur.left);
}
if(cur.right != null){
sonQueue.offer(cur.right);
}
sum = sum + cur.val;
count++;
if (parentQueue.isEmpty()) {
result.add(sum * 1.0 / count);
sum = 0;
count = 0;
parentQueue = sonQueue;
sonQueue = new LinkedList<>();
}
}
return result;
}