leetcode 637 二叉树的层平均值
解题思路:
1.可以采取广度遍历,用两个queue存放结点,一个存放第i层的结点,另外一个存放下一层节点。然后遍历完一层就计算其平均值,存入list中。
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Double> ans = new ArrayList<>();
queue.offer(root);
while(!queue.isEmpty()){
Queue<TreeNode> temp = new LinkedList<>();
long sum = 0,count = 0;
while(!queue.isEmpty()){
TreeNode tmp = queue.remove();
sum+=tmp.val;
count++;
if(tmp.left!=null){
temp.add(tmp.left);
}
if(tmp.right!=null){
temp.add(tmp.right);
}
}
queue = temp;
ans.add(sum*1.0/count);
}
return ans;
}
}
2.深度遍历:我们可以用两个数组 sum 存放树中每一层的节点数值之和,以及 count 存放树中每一层的节点数量之和。在遍历时,我们需要额外记录当前节点所在的高度,并根据高度 h 更新数组元素 sum[h] 和 count[h]。在遍历结束之后,res = sum / cnt 即为答案。
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Integer> count = new ArrayList<>();
List<Double> res = new ArrayList<>();
average(root,0,res,count);
for(int i = 0;i<res.size();++i){
res.set(i,res.get(i)/count.get(i));
}
return res;
}
public void average(TreeNode node,int i,List<Double> res,List<Integer> count){
if(node == null){//递归结束条件
return;
}
if(i<res.size()){//若已存在
res.set(i,res.get(i)+node.val);
count.set(i,count.get(i)+1);
}else{//不存在
res.add(1.0*node.val);
count.add(1);
}
average(node.left,i+1,res,count);
average(node.right,i+1,res,count);
}
}