树的层序遍历(详解)

server/2024/10/15 16:00:46/

下面以一道力扣题为例:

代码和解释如下:

java">/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {//要求:返回一个结果集,创建一个存储集合的集合;List<List<Integer>> res = new ArrayList<List<Integer>>();//基本思路:整个过程借助队列实现:(队列是一个接口,需要一个实现类)Queue<TreeNode> queue = new LinkedList<>();if(root == null){return res;}//root不为空,直接添加入队列;queue.offer(root);//创建一个死循环,当队列为空,即遍历结束时退出;while(true){//具体描述://1.创建一个可更新的集合,记录每层的结果;//2.定义一个变量记住每层的元素数量,方便控制队列的弹出的个数;//由于要先把前一层的元素全部弹出,所以队列中是下一层要处理的元素;List<Integer> list = new ArrayList<>();int size = queue.size();//根据处理个数,用for循环多次处理;for(int i = 0;i<size;i++){//1.先弹出元素,存入该元素的值//2.弹出一个元素,就添加其两边的左右节点,因此需要先记住结点TreeNode curNode = queue.poll();list.add(curNode.val);if(curNode.left != null){queue.offer(curNode.left);}if(curNode.right != null){queue.offer(curNode.right);}}//整个for循环完成了对本层数据的遍历并存入了一个临时集合,最后把集合收集到结果集res.add(list);if(queue.isEmpty()){break;}}return res;}
}

离开这一道题,我们应该明白什么?

层序遍历主要是如何实现的?依赖于什么数据结构,核心的想法是什么?

层序遍历的实现:

1.依赖于队列的数据结构

2.核心怎么实现:

        1)创建一个队列的容器对象。

        2)判断根节点是否为空,不为空则添加根节点到队列中。

        3)遍历是一个循环性的工作,写一个死循环,死循环的第一步就是跳出死循环的条件:当队列中没有东西时退出(换句话说,没东西可遍历了)。

        4)每弹出一个元素,再访问(就是进行符合场景的操作),最后添加两边的左右子节点(如果不为空的话)。


http://www.ppmy.cn/server/23724.html

相关文章

医生个人品牌网红IP孵化打造赋能运营方案

【干货资料持续更新&#xff0c;以防走丢】 医生个人品牌网红IP孵化打造赋能运营方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PPT可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 个人IP运营方案 1. 目标设定 - 个人定位&#xff1a;根据医生…

【Linux笔记】基本指令(一)

一道残阳铺水中 半江瑟瑟半江红 目录 Linux基本指令 罗列目录内容&#xff1a;ls 指令 显示当前目录位置信息&#xff1a;pwd 指令 切换工作目录&#xff1a;cd 指令 创建文件修改时间戳&#xff1a;touch指令 创建空目录&#xff1a;mkdir指令 删除空目录&#xff1a;rmdir指…

【题解】NowCoder 除2!

题目来源&#xff1a;牛客 除2&#xff01; 题目描述&#xff1a; 给一个数组&#xff0c;一共有 n 个数。 你能进行最多 k 次操作。每次操作可以进行以下步骤&#xff1a;   选择数组中的一个偶数 ai &#xff0c;将其变成 ai / 2 。 现在你进行不超过 k 次操作后&#xf…

NFTScan | 04.22~04.28 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2024.04.22~ 2024.04.28 NFT Hot News 01/ ApeCoin DAO 发起「由 APE 代币支持的 NFT Launchpad」提案投票 4 月 22 日&#xff0c;ApeCoin DAO 社区发起「由 APE 代币支持的 NFT Launch…

Swift - 枚举

文章目录 Swift - 枚举1. 枚举的基本用法2. 关联值&#xff08;Associated Values&#xff09;3. 关联值举例4. 原始值5. 隐式原始值&#xff08;Implicitly Assigned Raw Values&#xff09;6. 递归枚举&#xff08;Recursive Enumeration&#xff09;7. MemoryLayout Swift -…

buuctf——web题目练习

1.极客大挑战2019 easysql 密码或者用户输入万能密码即可 关于万能密码的理解和原理&#xff0c;可以参考这篇BUUCTF[极客大挑战 2019] EasySQL 1_[极客大挑战 2019]easysql 1-CSDN博客 2.极客大挑战2019 have fun 题目源码 需要构造payload 网页传参可参考&#xff1a;…

3、Flink执行模式(流/批)详解(上)

0、批模式和流模式对比表 类别流模式批模式任务调度所有任务需要持续运行&#xff0c;消耗资源大任务可以按Shuffle分阶段执行&#xff0c;消耗资源小Shuffle记录会被流水线式的持续发送到下游任务&#xff0c;在网络上进行缓冲可以保存Shuffle分阶段执行的中间结果State Back…

Java面试题:Spring里面的@RestController和@ResponseBody有什么作用?

ResponseBody ResponseBody一般是加在方法上&#xff0c;将返回的对象解析成xml或者json&#xff0c;返回给请求的调用者。一般是用于服务之间的调用&#xff0c;或者前端请求后端时&#xff0c;使用ajax请求。 如果不加ResponseBody&#xff0c;一般就是返回的url&#xff0c…