给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。




示例 1:

输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
分析:

解法一:DFS(深度优先搜索)

使用两个数组

count[],  每一层多少数量

sums[],  每一层总数

上代码把!开冲!
static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    /**
     * DFS解法
     */
    public List<Double> averageOfLevels(TreeNode root) {
       List<Integer> counts = new ArrayList<>(); //每一层的数量
       List<Double> sums = new ArrayList<>();    //每一层的总和

       dfs(root,0,counts,sums);

       List<Double> averages = new ArrayList<>();
       int size = sums.size();                    //总层数
        for (int i = 0; i < size; i++) {
            averages.add(sums.get(i)/ counts.get(i));
        }
        return averages;
    }

    public void dfs(TreeNode root , int level,List<Integer> counts, List<Double> sums){
        if(root == null){
            return;
        }

        if( level < sums.size()){
            sums.set(level , sums.get(level) + root.val);
            counts.set(level,counts.get(level) + 1);
        }else {
            //第0层,顶点
            sums.add(1.0*root.val);
            counts.add(1);
        }
        dfs(root.left,level+1,counts,sums);
        dfs(root.right,level+1,counts,sums);
    }
解法二:BFS(广度度优先搜索)  

使用队列,LinkedList<>(), 弹一个,进两个

每一层都放进去,然后出来,存孩子

看代码


/**
     * 队列,弹出来一个,进去两个
     * BFS
     */

    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> res = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            double sum = 0; //总和
            int size = queue.size(); //队列的总数量,
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                sum += node.val;
                TreeNode left = node.left, right = node.right;
                if (left != null) {
                    queue.offer(left);
                }
                if (right != null) {
                    queue.offer(right);
                }
            }
            res.add(sum / size);
        }
        return res;
    }