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;
    }
}
相关推荐
CHANG_THE_WORLD4 小时前
PDFium 处理通用 `W` 数组的方式
数据结构·算法
派大星~课堂4 小时前
【力扣-94.二叉树的中序遍历】Python笔记
笔记·python·leetcode
lixinnnn.4 小时前
多源BFS:刺杀大使
算法·宽度优先
AI成长日志4 小时前
【笔面试算法学习专栏】堆与优先队列实战:力扣hot100之215.数组中的第K个最大元素、347.前K个高频元素
学习·算法·leetcode
6Hzlia5 小时前
【Hot 100 刷题计划】 LeetCode 45. 跳跃游戏 II | C++ 贪心算法最优解题解
c++·leetcode·游戏
北顾笙9805 小时前
day18-数据结构力扣
数据结构·算法·leetcode
阿Y加油吧5 小时前
LeetCode 中等难度 | 回溯法进阶题解:单词搜索 & 分割回文串
算法·leetcode·职场和发展
QH_ShareHub5 小时前
反正态分布算法
算法
float_com5 小时前
LeetCode 27. 移除元素
leetcode
王老师青少年编程5 小时前
csp信奥赛c++中的递归和递推研究
c++·算法·递归·递推·csp·信奥赛