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;
    }
}
相关推荐
redaijufeng1 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油1 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-2 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新2 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
怪兽学LLM3 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪3 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
CC数学建模3 小时前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
leo__5203 小时前
MATLAB实现牧羊人算法
开发语言·算法·matlab
Gauss松鼠会3 小时前
【GaussDB】GaussDB SMP特性调优详解
java·服务器·前端·数据库·sql·算法·gaussdb
Tisfy3 小时前
LeetCode 3689.最大子数组总值 I:What The Medium
算法·leetcode·题解·贪心·模拟·脑筋急转弯