栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【剑指offer2】 chap7 队列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【剑指offer2】 chap7 队列

七、队列 1、基础知识
  • Queue:

    • 常用函数

      • add——offer

      • remove——poll

      • element——peek

    • 接口:

      • LinkedList

      • ArrayDeque

      • PriorityQueue

  • Deque(双端队列)

2、基本题型 (1)先入先出
  • 滑动窗口

    • 剑指 Offer II 041. 滑动窗口的平均值

    • 剑指 Offer II 042. 最近请求次数   while(队首)

      • class RecentCounter {
            private Queue times;
            private int windowSize;
        
            public RecentCounter() {
                times = new LinkedList<>();
                windowSize = 3000;
            }
        
            public int ping(int t) {
                times.offer(t);
                while (times.peek() + windowSize < t){
                    times.poll();
                }
                return times.size();
            }
        }

(2)二叉树BFS
  • 单队列+res

    • 剑指 Offer II 043. 往完全二叉树添加节点   

      • //bfs算法
        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;
        }
  • 二叉搜索树模板

    • class CBTInserter {
          private Queue queue;
          private 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();
              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;
          }
      }

  • 分层输出:计数法 或者 双队列交替法(加一个queue1是否为空的判断)

    • 剑指 Offer II 044. 二叉树每层的最大值       

    • 计数法

//方法一:计数法
    public List largestValues(TreeNode root) {
        int curr = 0;
        int next = 0;

        Queue queue = new LinkedList<>();
        List result = new LinkedList<>();

        if (root != null) {
            queue.offer(root);
            curr++;
        }

        int max = Integer.MIN_VALUE;

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            curr--;
            max = Math.max(max, node.val);

            if (node.left != null) {
                queue.offer(node.left);
                next++;
            }
            if (node.right != null) {
                queue.offer(node.right);
                next++;
            }

            if (curr == 0) {
                result.add(max);
                curr = next;
                max = Integer.MIN_VALUE;
                next = 0;
            }
        }
        return result;
    }
  •  双队列交替法   
    •           
      //方法二:双队列交替
      public List largestValues2(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;
                  queue2 = new LinkedList<>();
      
                  result.add(max);
                  max = Integer.MIN_VALUE;
              }
          }
          return result;
      }
                      
  • 剑指 Offer II 045. 二叉树最底层最左边的值    每层第一个

  • 剑指 Offer II 046. 二叉树的右侧视图              每层最后一个

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877703.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号