Leetcode __637. 二叉樹的層平均值
阿新 • • 發佈:2018-12-15
問題描述
給定一個非空二叉樹, 返回一個由每層節點平均值組成的陣列.
示例 1:
輸入: 3 / 9 20 / 15 7 輸出: [3, 14.5, 11] 解釋: 第0層的平均值是 3, 第1層是 14.5, 第2層是 11. 因此返回 [3, 14.5, 11]. 注意:
節點值的範圍在32位有符號整數範圍內。
解題思路
樹結構的 層序,第一反應的思路就是層序遍歷的思想:通過Queue來存每一行,通過三個遍歷來控制每一層,但這裡有要注意的是:層序遍歷的時候,最後一層的元素也單獨poll,這樣會多計算出一行空值,所以要去掉最後一項。
實現
/** * 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) { if (root == null) { return new ArrayList<Double>(); } int curCount = 0; int curNum = 1; int nextCount = 1; double linesum = 0;//坑點處 List<Double> reslist = new ArrayList<>(); reslist.add((double) root.val); Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { TreeNode t = queue.poll(); if (t.left != null) { queue.offer(t.left); linesum = linesum + t.left.val; nextCount++; } if (t.right != null) { queue.offer(t.right); linesum = linesum + t.right.val; nextCount++; } if (++curCount == curNum) { reslist.add((double) linesum / (nextCount - curCount)); linesum = 0; curNum = nextCount; } } reslist.remove(reslist.size()-1); return reslist; } }
陷阱
節點值的範圍在32位有符號整數範圍內:int雖然是4個位元組,32位,但 linesum = linesum + t.right.val;加和的結果就不是這個範圍了,要用double型別來接,否則會錯誤 double linesum = 0;//坑點處
別人的實現
class Solution { public List<Double> averageOfLevels(TreeNode root) { List<Double> res = new ArrayList<>(); Queue<TreeNode> que = new LinkedList<>(); que.add( root ); double curSum = 0; while( !que.isEmpty() ){ int si = que.size(); for( int i = 0 ; i < si ; i ++ ){ TreeNode cur = que.poll(); //每次彈出上一層節點 if( cur.left != null )que.add( cur.left );//queue放入當前層的節點 if( cur.right != null )que.add( cur.right ); curSum += cur.val;//計算上一層和 } res.add( curSum / si ); curSum = 0; } return res; } }
看起來更容易懂,更清晰一些
- 首先把根節點放入佇列
- 迴圈中取佇列的長度,根據長度,彈出並取出佇列元素,判斷彈出的元素是否有孩子節點,有的話就放入佇列,加和求平均值。