leetcode
leetcode 2601 ~ 2650
彩灯装饰记录 I

彩灯装饰记录 I

难度:

标签:

题目描述

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

代码结果

运行时间: 44 ms, 内存: 14.7 MB


// 题目思路:
// 1. 通过流的方式处理二叉树的层序遍历。
// 2. 使用一个队列来辅助遍历,将根节点放入队列。
// 3. 通过Stream的方式处理每一层的节点值,最后收集到一个列表中。

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

public class Solution {
    public List<Integer> levelOrder(TreeNode root) {
        if (root == null) return Collections.emptyList();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        return queue.stream()
            .flatMap(node -> {
                List<TreeNode> children = new ArrayList<>();
                if (node.left != null) children.add(node.left);
                if (node.right != null) children.add(node.right);
                queue.addAll(children);
                return Stream.concat(Stream.of(node), children.stream());
            })
            .map(node -> node.val)
            .collect(Collectors.toList());
    }

    // Definition for a binary tree node.
    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int val) { this.val = val; }
    }
}

解释

方法:

本题解使用了广度优先搜索(BFS)策略来遍历二叉树。首先,将根节点加入到队列中。然后,使用一个循环,每次从队列中取出一个节点,如果该节点不为空,就将其值加入到结果列表中,并将其左右子节点(如果存在)按顺序加入到队列中。这个过程一直持续到队列为空,此时所有节点都已按层次遍历完毕。最终,结果列表包含了从左到右的层次遍历结果。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在使用广度优先搜索(BFS)策略时,为什么选择使用队列而不是栈?
广度优先搜索(BFS)通过逐层访问节点来遍历树或图。使用队列来实现这一过程是因为队列是先进先出(FIFO)的数据结构,能够保证最先进入队列的节点(即当前层的节点)最先被处理,从而实现层次遍历。如果使用栈(后进先出,LIFO),则会先处理最近添加的节点,这样会导致深度优先搜索(DFS),而非层次遍历。
🦆
代码中的`queue.append(root)`操作是在什么条件下执行的,如果根节点`root`是`None`会怎样?
在题解中,`queue.append(root)`操作在函数开始时无条件执行,即不论根节点`root`是否为空都会被加入队列。如果根节点`root`是`None`,在后续的循环中,当尝试对这个`None`节点进行操作时,会直接跳过添加子节点的步骤,因为检查`if node`会失败(`None`评估为`False`)。因此,虽然`None`被加入队列,但不会对结果列表`res`造成影响。
🦆
结果列表`res`是如何确保按层次顺序存储节点值的?
结果列表`res`的层次顺序存储是通过队列的先进先出特性保证的。当一个节点从队列中取出时,它的子节点(左子节点和右子节点)按照从左到右的顺序被添加到队列尾部。这确保了在下一次迭代中,这些子节点将按照它们被添加的顺序被处理。由于每一层的节点都是按照从左到右的顺序进入队列并被处理,结果列表`res`自然按照层次顺序存储节点值。
🦆
在BFS过程中,代码如何处理二叉树中的空节点?
在题解中的BFS过程中,空节点(即`None`)被添加到队列中但不会对结果列表产生影响。这是因为在从队列中取出节点并尝试访问它的值之前,会检查节点是否为空(`if node:`)。如果节点是空的,即`node`为`None`,则不会执行任何操作(不会访问值,也不会尝试添加子节点到队列)。因此,空节点在逻辑上被忽略,只有非空节点的值被添加到结果列表`res`中。

相关问题