【題目】637. 二叉樹的層平均值
給定一個非空二叉樹, 返回一個由每層節點平均值組成的數組.
示例 1:
輸入:
3
/ \
9 20
/ \
15 7
輸出: [3, 14.5, 11]
解釋:
第0層的平均值是 3, 第1層是 14.5, 第2層是 11. 因此返回 [3, 14.5, 11].
注意:
節點值的範圍在32位有符號整數範圍內。
【解題思路1】DFS
/**
* 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){
List<Integer> count = new ArrayList<>();
List<Double> sum = new ArrayList<>();
List<Double> res = new ArrayList<>();
dfs(root,0,sum,count);
for(int i=0; i<sum.size(); i++){
res.add(sum.get(i) / count.get(i));
}
return res;
}
public void dfs(TreeNode cur, int layer, List<Double> sum, List<Integer> count){
if(cur == null){
return;
}
if(layer < sum.size()){
sum.set(layer, sum.get(layer)+cur.val);
count.set(layer, count.get(layer)+1);
}else{
//當前結點所在的層次(layer)深於sum與count存儲過的最大層次
//需要爲sum和count都開闢一個新的更深的層次,cur是這個層次中遍歷到的第一個結點
sum.add(cur.val*1.0);
count.add(1);
}
dfs(cur.left,layer+1,sum,count);
dfs(cur.right,layer+1,sum,count);
}
}
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 root, int i, List<Double> sum, List<Integer> count){
//i表示層數
if(root == null){
return;
}
if(i < sum.size()){
sum.set(i, sum.get(i) + root.val);
count.set(i, count.get(i) +1);
}else{ //這層還沒有加入和與個數
sum.add(1.0*root.val);
count.add(1);
}
average(root.left, i+1, sum, count);
average(root.right, i+1, sum, count);
}
}
【解題思路2】層次遍歷
public class Solution {
public List<Double> averageOfLevels(TreeNode root){
List<Double> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
//外層while循環用於遍歷層,判斷的邏輯是:只要queue非空,那就證明至少還有一層沒有遍歷到
long sum = 0;
long count = 0;
Queue<TreeNode> temp = new LinkedList<>();
while(!queue.isEmpty()){
//內層while循環用於遍歷本層的每個結點
TreeNode n = queue.remove();//一個結點出隊列
sum += n.val;
count++;
//將當前結點的左右孩子加入隊列temp
if(n.left!=null){
temp.add(n.left);
}
if(n.right!=null){
temp.add(n.right);
}
}
/*
* 本層結點遍歷結束,queue中爲空,temp中保存的是下一層的結點;
* 將temp傳給queue,外層while循環遍歷下一層結點
*/
queue = temp;
//將本層的平均值加入res數組
res.add(sum*1.0/count);
}
return res;
}
}