1. 程式人生 > 實用技巧 >Leetcode 637二叉樹的層平均值

Leetcode 637二叉樹的層平均值

Leetcode 637二叉樹的層平均值

資料結構定義:

給定一個非空二叉樹, 返回一個由每層節點平均值組成的陣列。



示例 1:

輸入:
    3
   / \
  9  20
    /  \
   15   7
輸出:[3, 14.5, 11]
解釋:
第 0 層的平均值是 3 ,  第1層是 14.5 , 第2層是 11 。因此返回 [3, 14.5, 11] 。

提示:

節點值的範圍在32位有符號整數範圍內。
    
/**
 * 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<Double> result =new ArrayList<>();
        Queue<TreeNode> queue =new LinkedList<>();
        TreeNode node; 
        if(root == null)
            return result;
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size(); 
            Double sum = 0.0;   
            for(int i = 0;i <size;i++){
                 node = queue.poll();
                 sum += node.val;
                 if(node.left != null)
                    queue.add(node.left);
                 if(node.right != null)
                    queue.add(node.right);
            }
            result.add(sum / size);
        }
        return result;
    }
}

遞迴方式:

/*
*思路: 1:  運用深度優先遍歷方式
	   2: result 儲存某層的所有數之和,counts 記錄該層的樹節點個數
	   3: level 記錄當前節點所在的層 。相同的層則將 總數 和 個數 放入對應下標層數的 result 和 counts
*/
class Solution {
    List<Double> result = new ArrayList<>();
    List<Integer> counts = new ArrayList<>();
    public List<Double> averageOfLevels(TreeNode root) {
        if(root == null)
            return result;
        dfs(root,0);
        for(int i = 0; i < result.size(); i++){
            result.set(i,result.get(i) / counts.get(i));
        }
        return result;
    }
    private void dfs(TreeNode root,int level){
        if(root == null)
            return;
        if(level >= result.size()){
            result.add((double)root.val);
            counts.add(1);
        }else{
            result.set(level,result.get(level) + root.val);
            counts.set(level,counts.get(level) + 1);
        }
        dfs(root.left,level + 1);
        dfs(root.right,level + 1);
    }
}