Leetcode 637二叉樹的層平均值
阿新 • • 發佈:2020-12-10
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); } }