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

算法day26

第一题

429. N 叉树的层序遍历

本题的要求我们可以通过队列来辅助完成层序遍历;

如下图的n叉树:

步骤一:

        我们定义一个队列,先进行根节点入队列操作;

步骤二:

        

        我们进行当前队列每一个元素的出队列操作,并将这个节点的值存放在tmp列表中;

步骤三:

        

        我们将上面根节点的子节点进行遍历,并一一放入到队列中,同时在进行出队列的时候,每出一个队列,该节点的值存放到tmp中,同时该节点的子节点也进行入队列操作;最后每一层的数值都会存放到惹他中,开始新的一层数据存储;

最后结束后如下图所示:

        

综上所述,代码如下:

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> ret = new ArrayList<>();if(root == null) return ret;Queue<Node> q = new LinkedList<>();q.add(root);while(!q.isEmpty()){int sz = q.size();//当前队列里的节点个数List<Integer> tmp = new ArrayList<>();//用来统计本层的节点信息for(int i = 0; i<sz;i++){Node t = q.poll();tmp.add(t.val);for(Node child:t.children){if(child != null) q.add(chile);}}ret.add(tmp);   }return ret;}
}

第二题

103. 二叉树的锯齿形层序遍历

        本题详细讲解如上题故事;

        至于区别就是从上往下数二叉树的偶数层,在放入到tmp表中之后进行逆转操作,然后将这些元素在放入到ret总表中,返回;

        综上所述,代码如下:

/*** 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>> zigzagLevelOrder(TreeNode root) {List<List<Integer>> ret = new ArrayList<>();if(root == null) return ret;Queue<TreeNode> q = new LinkedList<>();q.add(root);int floor = 1;while(!q.isEmpty()){int sz = q.size();//当前队列里的节点个数,当前层李米娜有多少元素List<Integer> tmp = new ArrayList<>();//用来统计本层的节点信息for(int i = 0; i<sz;i++){TreeNode t = q.poll();tmp.add(t.val);if(t.left != null)q.add(t.left);if(t.right != null)q.add(t.right);}if(floor % 2 == 0) Collections.reverse(tmp);ret.add(tmp);floor ++;}return ret;}
}

 第三题

662. 二叉树最大宽度

下图两个实例如下所示:

  解法:利用数组存储二叉树的方式,给结点编号;(堆的思想)

堆的数据结构:Pair<TreeNode树的结点,Integer定义的下标>

        我们将每一层的这种堆结构的结点放入到队列中,则该层的宽度就是该层最右边的节点下标减去-该层最左边的节点下标+1;

        同时每一层的宽度计算完成后,就将下一层的结点覆盖到队列中,重复计算每一层的节点宽度,直到求出最大值;

        综上所述,代码如下:

/*** 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 int widthOfBinaryTree(TreeNode root) {List<Pair<TreeNode,Integer>> q = new ArrayList<>();//用数组模拟队列q.add(new Pair<TreeNode,Integer>(root,1));int ret = 0;//记录最终结果while(!q.isEmpty()){//先更新一下这一层的宽度Pair<TreeNode,Integer> t1 = q.get(0);Pair<TreeNode,Integer> t2 = q.get(q.size()-1);ret = Math.max(ret,t2.getValue() - t1.getValue() +1);//让下一层进队List<Pair<TreeNode,Integer>> tmp = new ArrayList<>();//用数组模拟队列for(Pair<TreeNode,Integer> t:q){TreeNode node = t.getKey();int index = t.getValue();if(node.left != null){tmp.add(new Pair<TreeNode,Integer>(node.left,index*2));}if(node.right != null){tmp.add(new Pair<TreeNode,Integer>(node.right,index*2+1));}}q = tmp;}return ret;}
}

ps:本次的内容就到这里,如果对你有所帮助的话就请一键三连哦!!! 

相关文章:

  • spring boot jwt 实现用户登录完整java
  • 如何用 JavaScript 下载文件
  • C#版 iText7——画发票PDF(完整)
  • 多种异构数据的分析设计方案1:使用策略模式+函数式接口
  • 微服务项目雪崩的解决思路
  • 【吉林大学Java程序设计】第7章:对象的容纳
  • 了解Java的LinkedBlockingQueue
  • 什么是模板字符串?
  • Mathf.Approximately
  • grafana连接influxdb2.x做数据大盘
  • 深入学习html的步骤
  • 重磅新闻!狂揽120台订单!大运重卡唐山销服一体运营店盛大开业
  • nginx脚本原理if指令实现详解
  • Apache Doris 基础 -- 数据表设计(分层存储)
  • js原型链原理与查找机制
  • [译] 怎样写一个基础的编译器
  • 【译】理解JavaScript:new 关键字
  • 0基础学习移动端适配
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Cookie 在前端中的实践
  • iOS编译提示和导航提示
  • Java的Interrupt与线程中断
  • leetcode388. Longest Absolute File Path
  • vue.js框架原理浅析
  • Vue官网教程学习过程中值得记录的一些事情
  • 分布式熔断降级平台aegis
  • 关于extract.autodesk.io的一些说明
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 基于遗传算法的优化问题求解
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序填坑清单
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​iOS实时查看App运行日志
  • ### RabbitMQ五种工作模式:
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $.each()与$(selector).each()
  • (2)STM32单片机上位机
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (汇总)os模块以及shutil模块对文件的操作
  • (实战篇)如何缓存数据
  • (转)3D模板阴影原理
  • (转)Unity3DUnity3D在android下调试
  • .cn根服务器被攻击之后
  • .equals()到底是什么意思?
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET单元测试
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [8] CUDA之向量点乘和矩阵乘法