队列的基本知识
创始人
2025-05-31 09:24:58
0

一、在Java中,队列是一个定义了插入和删除操作的接口Queue
常用操作为:

操作抛异常不抛异常
插入元素add(e)offer(e)
删除元素removepoll()
返回最前面的元素elementpeek()

通常使用不抛出异常的函数
在Java中实现了接口Queue的常用类型有LinkedList、ArrayDeque、PriorityQueue等。但PriorityQueue并不是真正的队列
41-滑动窗口的平均值
在这里插入图片描述
解题思路:利用队列先进先出的特点,当队列满了的时候优先删除队头元素

class MovingAverage {/** Initialize your data structure here. */public Queue nums;public int cap;public int sum=0;//定义全局变量,sum具有累加效应public MovingAverage(int size) {nums=new LinkedList<>();cap=size;}public double next(int val) {nums.offer(val);//元素入队列sum+=val;if(nums.size()>cap){sum-=nums.poll();//元素出队列}return (double)sum/nums.size();}
}

二、通常基于队列来实现二叉树的广度优先搜索
二叉树的广度优先搜索是从上到下按层遍历二叉树。
从二叉树的根节点开始,先把根节点放入一个队列之中,然后每次从队列中取出一个节点遍历。如果该节点有左右子节点,则分别将它们添加到队列当中。
经典代码如下:

 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;}}//用队列实现二叉树的广度优先搜索public List bfs(TreeNode root){Queue queue=new LinkedList<>();if(root!=null){queue.offer(root);}List result=new ArrayList<>();while(!queue.isEmpty()){TreeNode node=queue.poll();//节点出队列result.add(node.val);if(node.left!=null){queue.offer(node.left);}if(node.right!=null){queue.offer(node.right);}}return result;}

43-在完全二叉树中添加节点

在这里插入图片描述
解题思路:
是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。
完全二叉树:一棵深度为k有n个节点的二叉树,对树中的节点按从上至下、从左至右的顺序进行编号,如果编号为i(1<=i<=n)的节点与满二叉树中编号为i的节点在二叉树中位置相同。

在完全二叉树中添加新节点顺序看起来是从上到下按层从左到右添加的,这就是典型的二叉树广度优先搜索的顺序
关于效率优化问题,没有必要在每次插入新的节点都从根节点开始从头进行广度优先搜索。

while(queue.peek().left!=null&&queue.peek().right!=null){TreeNode node=queue.poll();//若一个节点的左右孩子不为空,那么在队列中删除该节点,并让该节点的左右孩子入队列queue.offer(node.left);queue.offer(node.right);}

这一步代码是为了让有左右孩子的父节点不入队列,而它的左右孩子入队列,反复筛选,那么队首的元素就为第一个缺孩子的节点。
在这里插入图片描述
在这里插入图片描述

/*** 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 CBTInserter {Queue queue;TreeNode root;//初始化public CBTInserter(TreeNode root) {this.root=root;queue=new LinkedList<>();queue.offer(root);while(queue.peek().left!=null&&queue.peek().right!=null){TreeNode node=queue.poll();//若一个节点的左右孩子不为空,那么在队列中删除该节点,并让该节点的左右孩子入队列queue.offer(node.left);queue.offer(node.right);}}//插入一个节点public int insert(int v) {TreeNode parent=queue.peek();//parent已经记录队列中最前面的值(作为父节点)TreeNode node=new TreeNode(v);if(parent.left==null){parent.left=node;}else{parent.right=node;//一个节点的左右孩子不为空,那么在队列中删除该节点,并让该节点的左右孩子入队列queue.poll();queue.offer(parent.left);queue.offer(parent.right);}return parent.val;}public TreeNode get_root() {return this.root;}
}

44-二叉树每层的最大值
在这里插入图片描述
在这里插入图片描述
第一种:设置两个队列,第一个队列存放当前节点,第二个队列存放下一层节点,当第一个队列节点为空时,第一个队列置换成第二个队列,第二个队列清空。
代码如下:

/*** 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 largestValues(TreeNode root) {Queue queue1=new LinkedList<>();//存放当前层的节点Queue queue2=new LinkedList<>();//存放下一层的节点List result=new LinkedList<>();if(root!=null){queue1.offer(root);}int max=Integer.MIN_VALUE;while(!queue1.isEmpty()){TreeNode node=queue1.poll();max=Math.max(max,node.val);if(node.left!=null){queue2.offer(node.left);}if(node.right!=null){queue2.offer(node.right);}if(queue1.isEmpty()){queue1=queue2;//queue1指向queue2queue2=new LinkedList<>();//queue2队列的值清空result.add(max);max=Integer.MIN_VALUE;}}return result;   }
}

第二种思路:用两个变量current和next标记当前层和下一层

/*** 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 largestValues(TreeNode root) {int current=0;//记录当前层的节点个数int next=0;//记录下一层的节点个数Queue queue=new LinkedList<>();List result=new LinkedList<>();if(root!=null){queue.offer(root);current=1;}int max=Integer.MIN_VALUE;while(!queue.isEmpty()){current--;TreeNode node=queue.poll();max=Math.max(max,node.val);if(node.left!=null){next++;queue.offer(node.left);}if(node.right!=null){next++;queue.offer(node.right);}if(current==0){current=next;next=0;result.add(max);max=Integer.MIN_VALUE;}}return result;}
}

45-二叉树最底层最左边的值
在这里插入图片描述
解题思路:根据44题的改编,记录最底层最左边的节点,可以让队列1每次出栈队首元素就是每一层最左边的元素。

class Solution {public int findBottomLeftValue(TreeNode root) {Queue queue1=new LinkedList<>();//队列1记录当前节点信息Queue queue2=new LinkedList<>();//队列2记录下一层节点信息 int num=root.val;queue1.offer(root);while(!queue1.isEmpty()){TreeNode node=queue1.poll();if(node.left!=null){queue2.offer(node.left);}if(node.right!=null){queue2.offer(node.right);}if(queue1.isEmpty()){queue1=queue2;//当队列1为空时,队列1=队列2queue2=new LinkedList<>();//队列2清空,为了记录下一层节点信息 if(!queue1.isEmpty())num=queue1.peek().val;}}return num;}
}

46-二叉树的右侧视图
在这里插入图片描述
解题思路:根据第44题的改编,可以理解为每一层最右边的节点,也就是说当队列1(当前节点集合)为空时,记录最后一次出栈的节点值。

class Solution {public List rightSideView(TreeNode root) {Queue queue1=new LinkedList<>();Queue queue2=new LinkedList<>();List result=new LinkedList<>();if(root==null){return result;}queue1.offer(root);while(!queue1.isEmpty()){TreeNode node=queue1.poll();if(node.left!=null){queue2.offer(node.left);}if(node.right!=null){queue2.offer(node.right);}if(queue1.isEmpty()){result.add(node.val);queue1=queue2;queue2=new LinkedList<>();}}return result;}
}

47-二叉树剪枝在这里插入图片描述
解题思路:利用树后序遍历(左右根)的思想,先递归删除左右子树节点值全为0的节点,然后再判断当点节点左右子树节点全为空,且当前节点值为0时,这个节点才能删除。

class Solution {public TreeNode pruneTree(TreeNode root) {if(root==null){return root;}//利用后序遍历的思想root.left=pruneTree(root.left);//先递归删除左右子树节点值全为0的子树root.right=pruneTree(root.right);if(root.left==null&&root.right==null&&root.val==0){//当root左右子树全为空,并且它的值也为0时,这个节点才能被删除return null;}return root;}
}

相关内容

热门资讯

广西戏曲名家工作室揭牌 展示传... 来源:中国新闻网 中新网南宁6月7日电(黄令妍)6月7日,广西戏曲名家工作室在南宁揭牌,旨在搭建集戏...
文化新观察·文化赋能经济社会发... 转自:新华社  人是经济社会发展的主体,现代化的本质是人的现代化。  奔赴光荣与梦想的远征,文化正以...
武汉已出现极端暴雨!部分铁路封... 转自:北京日报客户端武汉已出现极端暴雨!今天(6月7日),武汉市气象台多次发布暴雨红色预警,恰逢高考...
济宁市总工会关爱新就业形态劳动... 转自:中工网济宁日报济宁讯(全媒体记者 曹梦溪)6月5日,济宁市总工会举行走基层、办实事、促发展暨新...
高质量发展看中国 | 非遗“潮... 来源:央广网 央广网南昌6月7日消息(记者刘培俊)千年夏布变身养生锤、耳饰、钥匙扣,百亿顶流“小哪吒...
工信部:打造智能制造“升级版” 转自:中工网中新社北京6月6日电 (记者 刘育英)中国工业和信息化部部长、部两化融合工作领导小组组长...
微信又上线新功能!网友:赶紧改   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 来源:中国经济网微信...
特朗普与马斯克公开发生“口水战... 转自:央视近日,美国总统特朗普与美国企业家、前政府效率部负责人马斯克因一项税改法案产生矛盾,二人相互...
祝福满满!这里有个“爱心助考”... 转自:上观新闻今天上午,2025年上海高考拉开帷幕。在上海外国语大学附属大境中学考点外,有一个临时搭...
汇聚业内众多影响力企业和组织 ... 转自:中安在线6月6日下午,全国首个轻型动力分钟级超充产业联盟成立大会暨《低压直流快速充电机(器)技...
2025“创·在青岛”创新创业... 转自:中工网青岛日报6月6日讯(青岛日报/观海新闻记者 任晓萌)由青岛市人力资源和社会保障局等9部门...
看看优秀的他们最喜欢看什么书?... 转自:上观新闻《小英雄雨来》《平凡的世界》《论语译注》《少年读史记》《钢铁是怎样炼成的》《红星照耀中...
当法徽遇见铁轨,将会迸发出怎样... 【当法徽遇见铁轨,将会迸发出怎样的司法火花?】(来源:人民法院报·2版 | 作者:王泽帅 吕雅伟 贺...
厚植爱国强军之志,松江区启动全... 转自:上观新闻日前,“爱国强军 复兴有我”2025年松江区全民国防教育主题活动季在佘山外国语实验学校...
从“金三银四”到“红五月”,上... 转自:界面新闻  今年1-5月,上海楼市“量价齐稳”。  图片来源:图虫创意  界面新闻记者 | 王...
护航高考,我们在行动   2025年全国统一高考于6月7日开考。据教育部数据,2025年全国高考报名人数达1335万人。考...
北京冬奥会冠军隋文静/韩聪即将... 转自:北京日报客户端中国花样滑冰协会6日晚公布了2025-2026赛季国际滑联花样滑冰大奖赛各分站赛...
泽连斯基透露“蛛网”行动新细节... 转自:上观新闻总台记者当地时间6月7日获悉,乌克兰总统泽连斯基在接受美国广播公司(ABC)采访时,透...
尹同跃:降价是应对竞争最无奈的...   Hehson科技讯 6月7日下午消息,2025中国汽车重庆论坛于6月6-7日举行,主题为“在变革...
教育部回应高考作文命题:引导考... 【#教育部回应高考作文命题#:引导考生写出真情真意】6月7日,2025年#高考作文#试题引发网友热议...