一、队列的特点
先进先出
队列的应用
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