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

优选算法的层序之径:队列专题

专栏:算法的魔法世界

个人主页:手握风云

目录

一、例题讲解

1.1. N 叉树的层序遍历

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

1.3. 二叉树最大宽度

1.4. 在每个树行中找最大值


一、例题讲解

1.1. N 叉树的层序遍历

题目要求给定一棵 N 叉树,需要返回该树节点值的层序遍历结果,层序遍历需遵循从左到右、逐层遍历的规则。

本题我们需要借助队列,先把根节点放入队列中,接着使用 while 循环,先统计队列里的元素个数,借助 for 循环将队头元素出队列,这样就可以将每一层的元素全部出队列,将其孩子节点加入到队列中,而下一层的节点又被全部加入队列。

/* // 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> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int n = queue.size(); List<Integer> curLevel = new ArrayList<>(); for (int i = 0; i < n; i++) { Node node = queue.poll(); curLevel.add(node.val); for (Node x : node.children) { queue.offer(x); } } ret.add(curLevel); } return ret; } }

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

本题要求实现二叉树的锯齿形层序遍历,给定二叉树的根节点 root,需返回其节点值按照锯齿形规则遍历后的结果,具体遍历规则为逐层遍历二叉树,第一层从左往右遍历节点,第二层从右往左遍历,后续每一层均与上一层的遍历方向交替切换。

/** * 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> queue = new LinkedList<>(); queue.offer(root); int height = 1; while (!queue.isEmpty()) { int n = queue.size(); List<Integer> curLevel = new ArrayList<>(); for (int i = 0; i < n; i++) { TreeNode node = queue.poll(); curLevel.add(node.val); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } if (height % 2 == 0) { Collections.reverse(curLevel); } height++; ret.add(curLevel); } return ret; } }

1.3. 二叉树最大宽度

要求给定一棵二叉树的根节点 root,计算并返回该二叉树的最大宽度。其中树的最大宽度为所有层中宽度的最大值,每一层的宽度定义为该层最左侧与最右侧的非空节点之间的长度,计算时需把该二叉树看作结构一致的满二叉树。

我们这里利用二叉树的顺序实现,假设根节点的下标为1,那么其左孩子节点下标为2 * 1,其右孩子节点下标为2 * 1 + 1。这次的队列不光需要存节点的地址,还需要存下标,这时我们可以使用 Pair 来存储 Pair<TreeNode, Integer>。我们从根节点开始,把根节点的地址和下标一起入队列,当根节点出队列的时候,如果左孩子节点或者右孩子不为空,则继续入队列。对于宽度的计算,我们只需要取出队头和队尾的元素的节点下标相减即可得到。

/** * 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>> queue = new ArrayList<>(); int ret = 0; queue.add(new Pair(root, 1)); while (!queue.isEmpty()) { Pair<TreeNode, Integer> t1 = queue.get(0); Pair<TreeNode, Integer> t2 = queue.get(queue.size() - 1); ret = Math.max(ret, t2.getValue() - t1.getValue() + 1); List<Pair<TreeNode, Integer>> tmp = new ArrayList<>(); for (Pair<TreeNode, Integer> t : queue) { TreeNode node = t.getKey(); int index = t.getValue(); if (node.left != null) { tmp.add(new Pair<>(node.left, index * 2)); } if (node.right != null) { tmp.add(new Pair<>(node.right, index * 2 + 1)); } } queue = tmp; } return ret; } }

1.4. 在每个树行中找最大值

这道题要求给定一棵二叉树的根节点root,需要找出该二叉树每一层节点中的最大值,并将每一层的最大值按层级顺序整理成列表返回。

本道题我们依然采用宽搜的思想,在每一层进行遍历的时候,定义一个变量,与每一个节点值进行比较并更新。

/** * 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<Integer> largestValues(TreeNode root) { List<Integer> ret = new ArrayList<>(); if (root == null) { return ret; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int len = queue.size(); int maxLevel = Integer.MIN_VALUE; for (int i = 0; i < len; i++) { TreeNode node = queue.poll(); maxLevel = Math.max(maxLevel, node.val); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } ret.add(maxLevel); } return ret; } }
http://www.jsqmd.com/news/616595/

相关文章:

  • OpenClaw技能组合方案:千问3.5-27B+OCR实现证件信息提取
  • Gemma-3-12b-it+OpenClaw内容处理:从资料收集到草稿生成全流程
  • YOLO12 WebUI边缘计算部署:低延迟实时检测方案
  • 2026年OptoCraft波前探测器选型推荐榜:Trim200离子束刻蚀机、Essent Optics分光光度计选择指南 - 优质品牌商家
  • PyTorch 2.8镜像部署YOLOv5目标检测模型:环境配置与推理优化
  • 从“人海战术”到“算法军团”:TVA引发的劳动力革命(4)
  • 幻境·流金多模态潜力:结合CLIP文本对齐实现高精度意合生成
  • FaceRecon-3D视觉特效实战:影视级数字人快速生成
  • AI产品经理逆袭指南:从技术小白到行业专家,这份学习地图请收好!
  • 2026年16A家电继电器/工控继电器/大电流继电器/通讯继电器公司对比推荐 - 品牌宣传支持者
  • Qwen3-0.6B-FP8一键部署Java面试题智能解析系统
  • OpenClaw自动化调研:Qwen2.5-VL-7B全网信息收集与分析
  • Starry Night艺术馆部署指南:Linux/Windows双平台环境适配步骤
  • 【鸿蒙HarmonyOS毕业系统毕设选题】最新颖的鸿蒙HarmonyOS毕业设计选题汇总易过的精品毕设项目分享(建议收藏)✅
  • OpenClaw隐私保护方案:千问3.5-27B本地处理敏感数据
  • 丹青幻境技术博文:Z-Image底座与Cosplay LoRA协同机制深度解析
  • Jimeng LoRA快速体验:开箱即用的Streamlit界面,无需前端知识轻松操作
  • IndexTTS2 V23问题排查:端口冲突、模型下载慢?常见问题一键解决
  • 卷积改进与轻量化:独家首发:ODConv(全维动态卷积)在 YOLOv11 中的应用,适应多尺度目标
  • FireRed-OCR Studio实战教程:OCR结果与数据库自动同步脚本
  • 文墨共鸣大模型Mathtype公式处理:将学术论文中的公式描述转化为LaTeX代码
  • 大模型技术全景解析:从ChatGPT到文心一言,你必须知道的AI核心知识!
  • AudioSeal Pixel Studio效果展示:蓝牙传输(SBC编码)后水印留存实测
  • OpenClaw+Phi-3-mini-128k-instruct双模型方案:平衡成本与性能
  • 2026年评价高的儿童空调家居服/夏季儿童家居服/儿童家居服睡衣/童装家居服主流厂家对比评测 - 行业平台推荐
  • 华为OD机试真题 新系统2026-04-01 C++实现【空间占用计算】
  • FLUX.1-dev-fp8-dit文生图快速部署:NVIDIA GPU显卡驱动+CUDA版本适配清单
  • OpenClaw多模型切换:Qwen3.5-9B与其他开源模型的协作方案
  • gemma-3-12b-it工业质检应用:上传产品缺陷图→生成结构化检测报告
  • 结合强化学习优化Qwen-Image-2512-Pixel-Art-LoRA 的提示词生成策略