当前位置: 首页 > news >正文

【LeetCode热题100】--102.二叉树的层序遍历

102.二叉树的层序遍历

image-20231003084207712

广度优先搜索:

我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。最后根据每个点的 level 对点进行分类,分类的时候我们可以利用哈希表,维护一个以 level 为键,对应节点值组成的数组为值,广度优先搜索结束以后按键 level 从小到大取出所有值,组成答案返回即可。

考虑如何优化空间开销:如何不用哈希映射,并且只用一个变量 node 表示状态,实现这个功能呢?

我们可以用一种巧妙的方法修改广度优先搜索:

  • 首先根节点入队
  • 当队列不为空时:
    • 求当前队列的长度 s i s_i si
    • 依次从队列中取 s i s_i si个元素进行拓展,然后进入下一次迭代

它和普通广度优先搜索的区别在于:普通广度优先搜索每次只取一个元素拓展,而这里每次取 s i s_i si个元素

/*** 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>> ans = new ArrayList<List<Integer>>();if(root == null){return ans;} //队列是先进先出Queue<TreeNode> queue = new LinkedList<TreeNode>();queue.offer(root);  //队列中添加根节点while(!queue.isEmpty()){List<Integer> level = new ArrayList<Integer>();int currentLevelSize = queue.size();for(int i = 1;i<=currentLevelSize;i++){TreeNode node = queue.poll();level.add(node.val);//如果左节点不为空,队列中先添加左节点if(node.left != null){queue.offer(node.left);}if(node.right != null){queue.offer(node.right);}}ans.add(level);}return ans;}
}
http://www.lryc.cn/news/181047.html

相关文章:

  • 第44节——redux store
  • 【2023年11月第四版教材】第17章《干系人管理》(第二部分)
  • 含分布式电源的配电网可靠性评估(matlab代码)
  • react的组件
  • 低功耗引擎Cliptrix为什么可以成为IOT的高效能工具
  • 深入学习git
  • 第9章 Mybatis
  • 隐蔽通信论文复现
  • 《Vue.js+Spring Boot全栈开发实战》简介
  • 机器人中的数值优化(二十)——函数的光滑化技巧
  • 搭建全连接网络进行分类(糖尿病为例)
  • 【小沐学前端】Node.js实现基于Protobuf协议的UDP通信(UDP/TCP)
  • Verasity Tokenomics — 社区讨论总结与下一步计划
  • JUC第十三讲:JUC锁: ReentrantLock详解
  • WSL2安装历程
  • Ubuntu20配置Mysql常用操作
  • 【解决方案】‘create’ is not a member of ‘cv::aruco::DetectorParameters’
  • 门牌制作(蓝桥杯)
  • 支付宝支付模块开发
  • 12、Kubernetes中KubeProxy实现之iptables和ipvs
  • 从0开始python学习-29.selenium 通过cookie信息进行登录
  • CentOS安装OpenNebula(二)
  • 力扣第239题 c++滑动窗口经典题 单调队列
  • 华为云云耀云服务器L实例评测|华为云云耀云服务器docker部署srs,可使用HLS协议
  • jira流转issue条目状态transitions的rest实用脚本,issue状态改变调整
  • JAVA 注解
  • C++面试题准备
  • 使用Java操作Redis
  • VRRP配置案例(路由走向分析,端口切换)
  • 【图像处理】【应用程序设计】加载,编辑和保存图像数据、图像分割、色度键控研究(Matlab代码实现)