1. 程式人生 > >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位有符號整數範圍內。

解題思路

樹結構的 層序,第一反應的思路就是層序遍歷的思想:通過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;        
    }
}

看起來更容易懂,更清晰一些

  • 首先把根節點放入佇列
  • 迴圈中取佇列的長度,根據長度,彈出並取出佇列元素,判斷彈出的元素是否有孩子節點,有的話就放入佇列,加和求平均值。