阅读 210
队列

队列

队列定义

  • 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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]

解题思路

  • 首先我们分析一下题干,站在最右边,也就是看到的是最右边的节点,所以我们可以按层遍历
  • 按层遍历,我们可以使用队列结构去处理,大概分一下几步:
  1. 我们先把根节点添加到队列中,然后进行while循环,只要队列不为空,就一直遍历
  2. 然后我们在while循环内部,通过一个for循环,以当前的队列长度为length,然后依次取出当前元素,然后如果该节点有left或者right节点 ,就依次加入到队列中
  3. 遍历的同时加入level中,然后在遍历结束后把这一层的level统一添加到results
  4. 最后遍历结束后,再进行一次外层的集合遍历,然后每次都取集合中的最后一个元素,也就是最右边一个元素,然后直接返回
/**
 * 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; i<len; i++){
            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; i<results.length; i++){
        let current = results[i];
        end.push(current[current.length - 1]);
    }

    return end;
};
复制代码
文章分类
前端
文章标签