leetcode
leetcode 2951 ~ 3000
在每个树行中找最大值

在每个树行中找最大值

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 29 ms, 内存: 18.1 MB


/*
 * 思路:
 * 使用广度优先搜索(BFS)和Java Stream来遍历二叉树的每一层。
 * 在遍历每一层时,记录该层的最大值。
 * 将每一层的最大值存入结果列表并返回。
 */

import java.util.*;
import java.util.stream.*;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            List<TreeNode> levelNodes = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                levelNodes.add(node);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            int max = levelNodes.stream().mapToInt(n -> n.val).max().orElse(Integer.MIN_VALUE);
            result.add(max);
        }
        return result;
    }
}

解释

方法:

这个题解使用了广度优先搜索(BFS)的方法来遍历二叉树。首先,创建一个队列来保存待处理的节点,以及一个列表来保存每一层的最大值。对于树中的每一层,我们从队列中移除当前层的所有节点,并在此过程中找到这一层的最大值。然后将该层的最大值添加到结果列表中。同时,如果当前节点有子节点,就将这些子节点添加到队列中,以便在下一轮中处理。重复这个过程直到队列为空,即所有层都被处理完毕。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
题解中提到使用了广度优先搜索(BFS),这种方法与深度优先搜索(DFS)相比在这种问题中有哪些优势和劣势?
使用广度优先搜索(BFS)的优势在于它能自然按层次遍历树结构,这使得计算每层的最大值变得直接和高效。BFS能够确保每次处理完一个层级的所有节点后再移向下一个层级,这对于需要按层次顺序处理数据的问题(如本题)非常合适。相比之下,深度优先搜索(DFS)会深入到某一条路径的末端,然后再回溯,这使得它在需要处理层级数据时可能需要额外的数据结构来记录节点的层级信息。然而,BFS的缺点是在最坏情况下可能需要更多的内存来存储所有同层的节点,特别是在树的宽度很大时。DFS通常使用的栈空间小于BFS在队列中需要的空间,尤其是在树较深且每层节点不均匀时。
🦆
题解中使用了 `-float('inf')` 作为每层最大值的初始化,这种方式是否适用于所有节点值都是正数的情况?有没有更优或者更通用的方法?
使用 `-float('inf')` 作为每层最大值的初始化是一种通用方法,它确保了任何可能的节点值都会被正确地比较,无论这些值是正数、负数还是零。即使在所有节点值都是正数的情况下,使用 `-float('inf')` 也不会有问题,因为它总是小于任何正数,因此可以正确地更新最大值。然而,如果知道节点值的可能范围,也可以选择一个更合适的初始最小值,比如如果节点值都在 0 到 1000 之间,可以使用 `-1` 作为初始值。但总体来说,`-float('inf')` 提供了一种无需额外信息即可安全使用的方法。
🦆
如果二叉树节点的值可以是非常大或者非常小的整数,是否需要考虑整数溢出的问题?
在 Python 中,整数类型(int)是动态的,可以自动扩展以容纳大整数,因此在 Python 中通常不需要担心整数溢出问题。这意味着无论节点的值有多大或多小,Python 都能够正确处理,不会像在一些其他语言(如 C 或 Java)中那样遇到整数溢出的问题。然而,在使用其他可能有整数限制的编程语言时,确实需要考虑这个问题,并可能需要采取额外的措施来防止溢出,例如使用更大的数据类型或在计算过程中进行检查。

相关问题