637.二叉树的层平均值
题目描述
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
给定代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
}
题解
本题有两种解法:深度优先搜索(DFS)和广度优先搜索(BFS)。
关键点有3个:层数、每层节点数量、每层节点的数值和。
1.深度优先搜索DFS
1)首先理解深度优先搜索就是不停得递归左右子树,树为null就返回;
2)其次要使用两个数组记录每一层的节点数量和每层节点的数值和;
3)数组使用Java中的List类,调用其中的add(),set(),get() 函数实现数组的 添加,赋值,取值
代码如下:
public List<Double> averageOfLevels(TreeNode root) {
List<Double> sum = new ArrayList<Double>();
List<Integer> count = new ArrayList<Integer>();
DFS(root, 0, sum, count);
List<Double> average = new ArrayList<Double>();
for(int i=0; i<count.size();i++){
average.add(sum.get(i) / count.get(i));
}
return average;
}
public void DFS(TreeNode root, int level, List<Double> sum, List<Integer> count){
if(root == null){
return;
}
if(sum.size() > level){
sum.set(level, sum.get(level) + root.val);
count.set(level, count.get(level) + 1);
}else{
sum.add(1.0 * root.val);
count.add(1);
}
DFS(root.right, level+1, sum, count);
DFS(root.left, level+1, sum, count);
}
2.广度优先搜索BFS
本题广度优先搜索类似于树的层序遍历。
广度优先搜索的核心就是利用队列把节点不停地add()和poll()出来,直到队列为空为止。
比较不太好想的地方是:如何把每一层的节点poll(),并记录下来。
解决方法为:利用size()函数记录每层的节点数量,再利用for循环遍历队列中size个节点。
这样平均值就可以直接用求和的sum/size即可得到。
具体代码如下:
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<TreeNode>();
List<Double> average = new ArrayList<Double>();
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
double sum = 0;
for(int i=0; i<size; i++){
TreeNode temp = queue.poll();
sum += temp.val;
if(temp.right != null){
queue.add(temp.right);
}
if(temp.left != null){
queue.add(temp.left);
}
}
average.add(sum/size);
}
return average;
}