队列定义
- 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,
而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入
操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列
- 特性:队列采用 先进先出 FIFO(first in first out),新元素(等待进入队列的元素)
总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便.
队列的常用操作
function Queue(){
this.items = [];
Queue.prototype.push = function(item){
this.items.push(item);
}
Queue.prototype.pop = function(){
return this.items.shift();
}
Queue.prototype.peek = function(){
return this.items[0];
}
Queue.prototype.isEmpty = function(){
return this.items.length === 0;
}
Queue.prototype.size = function(){
return this.items.length;
}
Queue.prototype.toString = function(){
let str = '';
for (let index = 0; index < this.items.length; index++) {
const item = this.items[index] + ' ';
str += item;
}
return str;
}
}
应用
题目
- 二叉树的右视图: 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。(leetCode上的题目,主要涉及二叉树和队列知识)
- 举例: 输入: [1,2,3,null,5,null,4] ---> 输出:[1, 3, 4]
解题思路
- 首先我们分析一下题干,站在最右边,也就是看到的是最右边的节点,所以我们可以按层遍历
- 按层遍历,我们可以使用队列结构去处理,大概分一下几步:
- 我们先把根节点添加到队列中,然后进行while循环,只要队列不为空,就一直遍历
- 然后我们在while循环内部,通过一个for循环,以当前的队列长度为length,然后依次取出当前元素,然后如果该节点有left或者right节点 ,就依次加入到队列中
- 遍历的同时加入level中,然后在遍历结束后把这一层的level统一添加到results
- 最后遍历结束后,再进行一次外层的集合遍历,然后每次都取集合中的最后一个元素,也就是最右边一个元素,然后直接返回
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
let queue = []
let results = []
if (root !== null) {
queue.push(root)
}
while(queue.length !== 0){
let level = []
let len = queue.length
for(let i=0
let current = queue.shift()
level.push(current.val)
if(current.left != null) queue.push(current.left)
if(current.right != null) queue.push(current.right)
}
results.push(level)
}
let end = []
for(let i=0
let current = results[i]
end.push(current[current.length - 1])
}
return end
}