637.二叉树的层平均值

51 阅读1分钟

题目链接

leetcode.cn/problems/av…

这道题目的解法有两种,一种是dfs,一种是使用队列实现的bfs算法,以下是题目的思路

dfs解法

对二叉树的遍历,很容易想到的就是前序遍历,在前序遍历的时候,记录当前层数,最后对层数进行打平计算,就可以获取最终结果,注意点遍历Map最好使用.entrySet方式,效率比keySet要高

 Map<Integer, List<Integer>> heightMap = new HashMap<>();

    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> res = new ArrayList<>();
        dfs(root, 0);
        for (Map.Entry<Integer, List<Integer>> integerListEntry : heightMap.entrySet()) {
            Integer key = integerListEntry.getKey();
            key = key - 1;
            double asDouble = integerListEntry.getValue().stream().mapToDouble(Number::doubleValue).average()
                    .getAsDouble();
            res.add(key, asDouble);
        }
        return res;
    }

    public void dfs(TreeNode root, Integer height) {
        if (root == null) {
            return;
        }
        //默认从0开始,先开始累积层数,再进行其他操作
        height = height + 1;
        List<Integer> values = heightMap.getOrDefault(height, new ArrayList<>());
        values.add(root.val);
        heightMap.put(height, values);

        dfs(root.left, height);
        dfs(root.right, height);
    }

bfs解法

使用bfs解法,首先是一个队列,记录元素先后顺序,其次是size(大小)元素,记录每一层的数量,以从队列中取

  public List<Double> averageOfLevels(TreeNode root) {
        List<Double> res = new ArrayList<>();
        dfs(root, res);
        return res;
    }

    public void dfs(TreeNode root, List<Double> res) {
        if (root == null) {
            return;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            Double itemResult = 0.0;
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                itemResult += Double.valueOf(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            res.add(itemResult / size);
        }

    }