375,在每个树行中找最大值

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
在这里插入图片描述


在这里插入图片描述

01
BFS求解

关于这道题我们最容易想到的也就是BFS,一层一层遍历,然后在每一层中再找出最大值。前面已经讲过很多BFS的题,这题不是很难。我们来直接看下代码。

public List<Integer> largestValues(TreeNode root) {
    //LinkedList实现队列
    Queue<TreeNode> queue = new LinkedList<>();
    List<Integer> values = new ArrayList<>();
    if (root != null)
        queue.add(root);//入队
    while (!queue.isEmpty()) {
        int max = Integer.MIN_VALUE;
        int levelSize = queue.size();//每一层的数量
        for (int i = 0; i < levelSize; i++) {
            TreeNode node = queue.poll();//出队
            max = Math.max(max, node.val);//记录每层的最大值
            if (node.left != null)
                queue.add(node.left);
            if (node.right != null)
                queue.add(node.right);
        }
        values.add(max);
    }
    return values;
}

02
DFS求解

除了一层一层遍历以外,我们还可以使用DFS(深度优先搜索算法)来求解。我们就以上面的举例来画个图分析一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面的橙色结点就是遍历的顺序,看明白了上面的图,代码就很容易写出来了,我们再来看下代码

public List<Integer> largestValues(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    helper(root, res, 1);
    return res;
}

//level表示的是第几层,集合res中的第一个数据表示的是
// 第一层的最大值,第二个数据表示的是第二层的最大值……
private void helper(TreeNode root, List<Integer> res, int level) {
    if (root == null)
        return;
    //如果走到下一层了直接加入到集合中
    if (level == res.size() + 1) {
        res.add(root.val);
    } else {
        //注意:我们的level是从1开始的,也就是说root
        // 是第一层,而集合list的下标是从0开始的,
        // 所以这里level要减1。
        // Math.max(res.get(level - 1), root.val)表示的
        // 是遍历到的第level层的root.val值和集合中的第level
        // 个元素的值哪个大,就要哪个。
        res.set(level - 1, Math.max(res.get(level - 1), root.val));
    }
    //下面两行是DFS的核心代码
    helper(root.left, res, level + 1);
    helper(root.right, res, level + 1);
}

在这里插入图片描述

posted @ 2020-09-25 20:42  数据结构和算法  阅读(81)  评论(0编辑  收藏  举报