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;
    }
}
相关推荐
2401_889884661 小时前
嵌入式C++测试框架
开发语言·c++·算法
月明长歌1 小时前
【码道初阶-Hot100】LeetCode 128. 最长连续序列:从排序双指针扫描到 HashSet,一文讲透为什么 O(n) 解法要用哈希
算法·leetcode·哈希算法
Z9fish2 小时前
C语言算法专题总结(一)排序
c语言·算法·排序算法
美式请加冰2 小时前
模拟的介绍和使用
java·开发语言·算法
云泽8082 小时前
蓝桥杯算法精讲:贪心算法之区间问题深度剖析
算法·贪心算法·蓝桥杯
tankeven2 小时前
HJ129 小红的双生数
c++·算法
万能的小裴同学2 小时前
C++ 简易的FBX查看工具
开发语言·c++·算法
Boop_wu2 小时前
[Java 算法] 前缀和(2)
算法·哈希算法·散列表
Hello.Reader2 小时前
深入浅出 Adam 优化算法从直觉到公式
深度学习·算法