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;
    }
}
相关推荐
To_OC3 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495644 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
爱刷碗的苏泓舒8 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽11 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米11 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠11 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA13 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel13 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客13 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化