问题:
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array.
Example 1:
Input: 3 / \ 9 20 / \ 15 7 Output: [3, 14.5, 11] Explanation: The average value of nodes on level 0 is 3, on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11].
Note:
- The range of node's value is in the range of 32-bit signed integer.
解决:
① 层次遍历或者BFS遍历二叉树组,在每一层计算平均值即可。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {//10ms
public List<Double> averageOfLevels(TreeNode root) {
List<Double> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(! queue.isEmpty()){
int count = queue.size();
double sum = 0.0;
for (int i = 0;i < count ;i ++ ) {
TreeNode cur = queue.remove();
sum += cur.val;
if(cur.left != null) queue.add(cur.left);
if (cur.right != null) queue.add(cur.right);
}
list.add(sum / count);
}
return list;
}
}
② 将具体实现函数提取出来,可以提高效率。
public class Solution {//8ms
public List<Double> averageOfLevels(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
List<Double> list = new ArrayList<>();
averageOfLevels(queue,list);
return list;
}
private void averageOfLevels(LinkedList<TreeNode> queue,List<Double> list){
int count = queue.size();
if(count == 0)
return;
double sum = 0;
for(int i = 0;i < count;i ++){
TreeNode cur = queue.poll();
if(cur.left != null)
queue.add(cur.left);
if(cur.right != null)
queue.add(cur.right);
sum += cur.val;
}
list.add(sum / count);
averageOfLevels(queue,list);
}
}
③ ②等价于本方法。
public class Solution {//10ms
public List<Double> averageOfLevels(TreeNode root) {
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
List<Double> list = new ArrayList<>();
averageOfLevels(queue,list);
return list;
}
private void averageOfLevels(LinkedList<TreeNode> queue,List<Double> list){
while(! queue.isEmpty()){
int count = queue.size();
if(count == 0)
return;
double sum = 0;
for(int i = 0;i < count;i ++){
TreeNode cur = queue.poll();
if(cur.left != null)
queue.add(cur.left);
if(cur.right != null)
queue.add(cur.right);
sum += cur.val;
}
list.add(sum / count);
}
}
}