LeetCode题解No637——“二叉树的层平均值”
LeetCode题解
No637
难度:Easy
题目描述:
/*
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
提示:
节点值的范围在32位有符号整数范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
题目思路
看到类似按层求的题目,首先就想到BFS广度优先遍历,这道题也是这样,对于每一层用一个临时的size储存本层的一个长度,根据这个size去从队列中把本层的节点出队,随后用一个sum去维护本层的节点值的和,等该层遍历完之后,将sum/size添加到list中,遍历结束返回list即可
代码执行
public class No637 {
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x){
val = x;
}
}
public List<Double> averageOfLevels(TreeNode root) {
List<Double> list = new ArrayList<Double>();
// 特判
if (root == null){
return list;
}
// 对其进行层序遍历
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
// 如果不为空的时候进行循环
while(!queue.isEmpty()){
// 每层的一个宽度
int size = queue.size();
// 用于保存每层的节点的值的和
double ans = 0;
for (int i = 0; i < size; i++) {
// 出队
TreeNode cur = queue.poll();
ans+=cur.val;
// 如果当前出队的节点左子树不为空,加入队列中
if (cur.left != null){
queue.offer(cur.left);
}
// 如果当前出队的节点右子树不为空,加入队列中
if (cur.right != null){
queue.offer(cur.right);
}
}
double cur_ans = ans/size;
list.add(cur_ans);
}
return list;
}
}
纠错
1:第一次跑测试的时候,把代码中的ans值设定成了int类型,导致结果出现29/2 = 14的情况,改成double类型后解决