637. Average of Levels in Binary Tree

这题虽说是签到题,但如果你没练习过,想做出来估计很难吧。
这题我用的DFS,就是给每一层创建一个list,dfs到那一层就把val加到对应的list。偷懒了用了额外存储。

DFS

    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> res = new ArrayList<>();
        List<List<Integer>> nodes = new ArrayList<>();
        if (root == null) return res;
        dfs(nodes, root, 0);
        for (int i = 0; i < nodes.size(); i++) {
            double total = 0;
            for (int j = 0; j < nodes.get(i).size(); j++) {
                total += nodes.get(i).get(j);
            }
            res.add(total / nodes.get(i).size());
        }
        return res;
    }

    private void dfs(List<List<Integer>> res, TreeNode node, int level) {
        if (node == null) return;
        if (level >= res.size()) {
            res.add(new ArrayList<Integer>());
        }
        res.get(level).add(node.val);
        dfs(res, node.left, level + 1);
        dfs(res, node.right, level + 1);
    }

BFS

这题用用bfs容易一些,因为在每次queue的当前level全部出队顺势计算一下就好了,如下:

public List<Double> averageOfLevels(TreeNode root) {
    List<Double> result = new ArrayList<>();
    Queue<TreeNode> q = new LinkedList<>();
    
    if(root == null) return result;
    q.add(root);
    while(!q.isEmpty()) {
        int n = q.size();
        double sum = 0.0;
        for(int i = 0; i < n; i++) {
            TreeNode node = q.poll();
            sum += node.val;
            if(node.left != null) q.offer(node.left);
            if(node.right != null) q.offer(node.right);
        }
        result.add(sum / n);
    }
    return result;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容