给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
注意:
节点值的范围在32位有符号整数范围内。
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Double> res = new ArrayList();
if(root == null)
return res;
TreeNode cur = null;
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
int count = queue.size();
double sum = 0;
for(int i=0;i<count;i++){
cur = queue.poll();
sum += cur.val;
if(cur.left != null)
queue.offer(cur.left);
if(cur.right != null)
queue.offer(cur.right);
}
res.add(sum/count);
}
return res;
}
}
在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多的节点数,就能保证这次遍历的都是当前层的节点。
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Double> res = new ArrayList();
if(root == null)
return res;
TreeNode cur = null;
TreeNode last = root;
TreeNode nlast = null;
int count = 0;
double sum = 0;
Queue<TreeNode> queue = new LinkedList();
queue.offer(root);
while(!queue.isEmpty()){
cur = queue.poll();
count++;
sum += cur.val;
if(cur.left != null){
queue.offer(cur.left);
nlast = cur.left;
}
if(cur.right != null){
queue.offer(cur.right);
nlast = cur.right;
}
//注意:这个要放在后面,因为nlast
if(cur == last){
double tmp = sum / count;
res.add(tmp);
sum = 0;
count = 0;
last = nlast;
}
}
return res;
}
}