LeetCode:102. 二叉树的层序遍历

简介

题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/description/

解决方式:广度优先搜索算法

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐查看灵茶山艾府、nettee大佬所作题解。

层序遍历相似题:

  • LeetCode 103. Binary Tree Zigzag Level Order Traversal 之字形层序遍历
  • LeetCode 199. Binary Tree Right Side View 找每一层的最右结点
  • LeetCode 515. Find Largest Value in Each Tree Row 计算每一层的最大值
  • LeetCode 637. Average of Levels in Binary Tree 计算每一层的平均值

双数组

解题思路是两个数组。一个数组存储当前层的所有节点,另一个数组在迭代过程中存储当前节点的下一层的所有节点,当前层节点迭代完毕后将下一层节点的集合置为当前层节点。

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 处理边界
        if(root == null){
            return List.of();
        }
        // 结果集合
        List<List<Integer>> list = new ArrayList<>();
        // 当前一层的所有节点
        List<TreeNode> cur = List.of(root);
        // 迭代当前层的所有节点,得到层序遍历结果和下一层的所有节点
        // 不能写成 cur != null,因为空列表也不是 null,会导致死循环
        while(!cur.isEmpty()){
            // 当前层序节点值。预先分配好大小,防止扩容
            ArrayList<Integer> vals = new ArrayList<>(cur.size());
            // 下一层节点
            ArrayList<TreeNode> next = new ArrayList<>();
            // 迭代当前层的所有节点
            for(TreeNode node : cur){
                // 值
                vals.add(node.val);
                // 节点
                if(node.left != null) next.add(node.left);
                if(node.right != null) next.add(node.right);
            }
            // 迭代完当前层节点
            // 结果添加进结果集合
            list.add(vals);
            // 更新当前节点层为下一个节点层
            cur = next;
        }
        // 返回结果
        return list;
    }
}

队列

解题思路是一个队列。相比于双数组,一个队列的空间效率更高。解决问题的思路也是跟双数组一样,迭代当前层的所有节点,同时存储当前层节点的下一层节点。

java 复制代码
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 处理边界
        if(root == null){
            return List.of();
        }
        // 结果集合
        List<List<Integer>> list = new ArrayList<>();
        // 队列
        Queue<TreeNode> q = new ArrayDeque<>();
        // 初始时,当前层的所有节点只有根节点
        q.add(root);
        // 迭代队列中,当前层的所有节点,得到层序遍历结果和下一层的所有节点
        // 在迭代前,队列中同时存在的节点就是当前层的所有节点
        while(!q.isEmpty()){
            // 获取队列的大小,此大小决定此层的值个数和迭代次数
            int n = q.size();
            // 当前层序节点值。预先分配好大小,防止扩容
            ArrayList<Integer> vals = new ArrayList<>(n);
            // 迭代当前层的所有节点
            while(n-- > 0){
                TreeNode node = q.poll();
                // 值
                vals.add(node.val);
                // 节点。迭代中添加的节点是下一层的节点
                if(node.left != null) q.add(node.left);
                if(node.right != null) q.add(node.right);
            }
            // 迭代完当前层节点
            // 结果添加进结果集合
            list.add(vals);
        }
        // 返回结果
        return list;
    }
}
相关推荐
需要82612 小时前
分布式 ID 生成:雪花算法、号段模式与时钟回拨
分布式·算法
垆边人似月.12 小时前
华为机考题:字符串分隔
算法·华为
CQU_JIAKE12 小时前
9.4【A】
算法
CQU_JIAKE12 小时前
9.13[A]
算法
懿路向前12 小时前
【唤醒实战笔记】2026-09-29 | 智能体提示词迭代史(v1 → v8)
linux·笔记·算法
@陈小鱼13 小时前
基于CNN-Transformer的无袖带血压估计
人工智能·深度学习·神经网络·算法·cnn·transformer·血压
黄金龙PLUS13 小时前
5个1280比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
不会就选b13 小时前
算法日常・每日刷题--<动态规划>1
java·数据结构·算法
shehuiyuelaiyuehao13 小时前
算法54,链表 两数相加
数据结构·算法·链表
147API14 小时前
如何设计“回答、追问、停答”三类蒸馏训练集
人工智能·算法·机器学习