​LeetCode刷题实战515:在每个树行中找最大值

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 在每个树行中找最大值,我们先来看题面:

https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row/

Given the root of a binary tree, return an array of the largest value in each row of the tree (0-indexed).

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例

afcc19d820495f9934bca999995151de.png


解题

https://blog.csdn.net/qq_35655602/article/details/109520323

方法一:BFS(按照层序遍历的思想,进行广度优先遍历)

36b5d9c66a323b55acfa0f80e175a939.png

class Solution {
     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;
    }

}

方法二:DFS

b77d8862724a1241e83b945ee35d2f2a.png

f06ec95892186b7360216c4e106f0075.png

3b131fcba3889cce29a397580997f94e.png

899e22109c348d785ceb2a1173769e1f.png

class Solution {
        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);
    }

}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-500题汇总,希望对你有点帮助!

LeetCode刷题实战501:二叉搜索树中的众数

LeetCode刷题实战502:IPO

LeetCode刷题实战503:下一个更大元素 II

LeetCode刷题实战504:七进制数

LeetCode刷题实战505:迷宫II

LeetCode刷题实战506:相对名次

LeetCode刷题实战507:完美数

LeetCode刷题实战508:出现次数最多的子树元素和

LeetCode刷题实战509:斐波那契数

LeetCode刷题实战510:二叉搜索树中的中序后继 II

LeetCode刷题实战511:游戏玩法分析 I

LeetCode刷题实战512:游戏玩法分析 II

LeetCode刷题实战513:找树左下角的值

a58a65591b923c8e5b4ed7c73e2c8cef.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值