二叉树的层序遍历

一、题目

给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)

例如:

给定的二叉树是{3,9,20,null,null,15,7},

该二叉树层序遍历的结果是

\[3\],\[9,20\],\[15,7\]

二、解决方案

2.0 树节点构造

java 复制代码
 public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
 }

2.1 直接逐层遍历,定义nextNodeList和curLevelList,每遍历一层,就将当前层节点curList添加到结果res中。

java 复制代码
// 定义nextNodeList和curLevelList,每遍历一层,就将当前层节点curList添加到结果res中
    public List<List<Integer>> levelOrderOne(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return null;
        }

        // 存储当前层的节点
        List<TreeNode> curList = new ArrayList<>();
        curList.add(root);
        // 每遍历一层,就将当前层节点curList添加到结果res中
        while(!curList.isEmpty()){
            List<TreeNode> nextNodeList = new ArrayList<>();
            List<Integer> curLevelList = new ArrayList<>();
            for(TreeNode node : curList){
                curLevelList.add(node.val);
                if(node.left != null){
                    nextNodeList.add(node.left);
                }
                if(node.right != null){
                    nextNodeList.add(node.right);
                }
            }
            res.add(curLevelList);
            curList = nextNodeList;
        }
        return res;
    }

2.2 利用队列实现

因为队列是先进先出的数据结构,如果从左到右访问完一行节点,并在访问的时候把它们的子节点依次加入到队列,这时候它们的子节点也是按照顺序来进行的。且排在本行节点的后面,因此队列中出现的顺序正好也是从左到右,正好符合层次遍历的特点。

java 复制代码
    /**
     * 建立辅助队列,根节点首先进入队列。不管层次怎么访问,根节点一定是第一个,那它肯定排在队伍的最前面。
     * 每次进入一层,统计队列的元素个数,因为每当访问完一层,下一层作为这一层的子节点,一定都加入队列,而再下一层还没有加入,因此此时队列中的元素个数就是这一层的元素个数。
     * 每次遍历这一层这么多的节点数,将其依次从队列中弹出,然后加入这一行的一维数组中,如果它们有子节点,依次加入队列排队等待访问。
     * 访问完这一层的元素后,将这个一维数组加入二维数组中,再访问下一层。
     */
    public List<List<Integer>> levelOrderTwo(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return null;
        }

        Queue<TreeNode> queue = new ArrayDeque<>();
        queue.add(root);
        while(!queue.isEmpty()){
            // 记录二叉树的某一行
            List<Integer> currentRow = new ArrayList();
            int currentQueueSize = queue.size();
            for (int i = 0; i < currentQueueSize; i++) {
                // 先存当前根节点
                TreeNode node = queue.poll();
                currentRow.add(node.val);
                // 若是左右孩子存在,则存入左右孩子作为下一个层次
                if(node.left!= null){
                    queue.add(node.left);
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
            }
            res.add(currentRow);
        }

        return res;
    }
相关推荐
小龙报15 分钟前
算法通关指南:数据结构和算法篇 --- 队列相关算法题》--- 1. 【模板】队列,2. 机器翻译
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
晨非辰31 分钟前
【数据结构初阶】--从排序算法原理分析到代码实现操作,参透插入排序的奥秘!
c语言·开发语言·数据结构·c++·算法·面试·排序算法
三川6982 小时前
排序算法介绍
数据结构·算法·排序算法
智驱力人工智能6 小时前
基于视觉分析的人脸联动使用手机检测系统 智能安全管理新突破 人脸与手机行为联动检测 多模态融合人脸与手机行为分析模型
算法·安全·目标检测·计算机视觉·智能手机·视觉检测·边缘计算
2301_764441337 小时前
水星热演化核幔耦合数值模拟
python·算法·数学建模
循环过三天7 小时前
3.4、Python-集合
开发语言·笔记·python·学习·算法
priority_key9 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
不染尘.9 小时前
2025_11_7_刷题
开发语言·c++·vscode·算法
来荔枝一大筐11 小时前
力扣 寻找两个正序数组的中位数
算法
算法与编程之美11 小时前
理解Java finalize函数
java·开发语言·jvm·算法