数据结构——队列与广度优先遍历

本文介绍了队列的特点,包括一般队列、优先队列和循环队列,并探讨了队列在实际问题中的应用。同时,文章详细阐述了广度优先搜索(BFS)的基本概念,指出BFS在寻找最短路径中的优势及其空间复杂度分析。通过实例力扣200题,进一步解释了BFS在解决岛屿数量问题上的应用。
摘要由CSDN通过智能技术生成

一、队列的特点

先进先出
队列的应用

1. 一般的队列

用链表或动态数组和指向队列头部的索引实现,队列应支持两种操作:入队和出队,具体看队列
缺点:使用固定大小数组时,会造成空间浪费
在这里插入图片描述
当删掉队首元素后,头指针后移,有一个空位无法使用。
解决方法:使用循环队列

2. 优先队列

优先队列给每个元素增加了一个优先级属性,优先级大的元素在前面,具体实现看优先级队列

3. 循环队列

使用固定大小的数组和两个指针指示起始位置和终止位置,重用被浪费的存储。

  • 头指针在前
    在这里插入图片描述
  • 头指针在后
    在这里插入图片描述

力扣:设计循环队列

我的实现

二、广度优先搜索(BFS)

1. BFS的特点

(1)每一层的节点齐头并进,像是面一样往前走,所以在某一层找到的目标就是最短路径。
(2)BFS的空间复杂度比DFS高,对于DFS空间复杂度就是递归堆栈,最坏情况下顶多就是树的高度,也就是O(logN);对于BFS存储每一层的所有节点,最坏情况下空间复杂度是树的最底层节点的数量N/2,即O(N)。

// 模板
function BFS(root, target) {
   
	// 定义队列,存入根节点
	let queue = [root];
	// 每一层到根节点的距离
	let step = 0;
	// 使用哈西表防止重复访问同一个节点
	let hash = new Set();
	hash.set(root);
	// 队列不为空就说明没有遍历完
	while(queue.length) {
   
		// 深度加一
		step += 1;
		// 当前层节点的数量
		let size 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值