首页 > 编程语言 >12.优化算法之队列+宽搜(BFS)

12.优化算法之队列+宽搜(BFS)

时间:2024-07-03 10:00:59浏览次数:32  
标签:12 队列 List ret BFS int add new root

BFS——广度优先算法(Breadth First Search)-CSDN博客

1.N叉树的层序遍历(广度优先搜索)

429. N 叉树的层序遍历 - 力扣(LeetCode)

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> ret=new LinkedList<>();
        if(root==null){
            return ret;
        }
        Queue<Node> q=new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()){
            int sz=q.size();
            List<Integer> tmp = new ArrayList<>(); // 统计本层的结点信息
            for(int i=0;i<sz;i++){
                Node t=q.poll();
                tmp.add(t.val);
                //让孩子入队
                for(Node child:t.children){
                    if(child!=null){
                        q.add(child);
                    }
                }
            }
            ret.add(tmp);
        }
        return ret;
    }
}

 2.⼆叉树的锯⻮形层序遍历

103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

增加一个标记位,让偶数行存储信息的数据逆序

class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ret = new LinkedList<List<Integer>>();
        if (root == null) {
            return ret;
        }
        Queue<TreeNode> q=new LinkedList<>();
        q.add(root);
        int level=1;
        while(!q.isEmpty()){
            int sz=q.size();
            List<Integer> list=new LinkedList<>();
            for(int i=0;i<sz;i++){
                TreeNode t=q.poll();
                list.add(t.val);
                if(t.left!=null){
                    q.add(t.left);
                }
                if(t.right!=null){
                    q.add(t.right);
                }
            }
            //判断是否逆序
            if(level%2==0){
                Collections.reverse(list);
            }
            level++;
            ret.add(list);
        }
        return ret;
    }
}

3.二叉树最大宽度

介绍java中Pair和Map的区别-CSDN博客

662. 二叉树最大宽度 - 力扣(LeetCode)

 

class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        List<Pair<TreeNode, Integer>> q = new ArrayList<>(); // ⽤数组模拟队列
        q.add(new Pair<TreeNode, Integer>(root, 1));
        int ret = 0; // 记录最终结果
        while (!q.isEmpty()) {
            // 先更新⼀下这⼀层的宽度
            Pair<TreeNode, Integer> t1 = q.get(0);
            Pair<TreeNode, Integer> t2 = q.get(q.size() - 1);
            ret = Math.max(ret, t2.getValue() - t1.getValue() + 1);
            // 让下⼀层进队
            List<Pair<TreeNode, Integer>> tmp = new ArrayList<>();
            for (Pair<TreeNode, Integer> t : q) {
                TreeNode node = t.getKey();
                int index = t.getValue();
                if (node.left != null) {
                    tmp.add(new Pair<TreeNode, Integer>(node.left, index * 2));
                }
                if (node.right != null) {
                    tmp.add(new Pair<TreeNode, Integer>(node.right, index * 2
                            + 1));
                }
            }
            q = tmp;
        }
        return ret;
    }
}

 4.在每个树行中找最大值

515. 在每个树行中找最大值 - 力扣(LeetCode)

class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if (root == null)
            return ret;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        while (!q.isEmpty()) {
            int sz = q.size();
            int tmp = Integer.MIN_VALUE;
            for (int i = 0; i < sz; i++) {
                TreeNode t = q.poll();
                tmp = Math.max(tmp, t.val);
                if (t.left != null)
                    q.add(t.left);
                if (t.right != null)
                    q.add(t.right);
            }
            ret.add(tmp);
        }
        return ret;
    }
}

标签:12,队列,List,ret,BFS,int,add,new,root
From: https://blog.csdn.net/m0_47017197/article/details/140078448

相关文章

  • Golang 依赖注入设计哲学|12.6K 的依赖注入库 wire
    一、前言线上项目往往依赖非常多的具备特定能力的资源,如:DB、MQ、各种中间件,以及随着项目业务的复杂化,单一项目内,业务模块也逐渐增多,如何高效、整洁管理各种资源十分重要。本文从“术”层面,讲述“依赖注入”的实现,带你体会其对于整洁架构&DDD等设计思想的落地,起到的支撑作用。......
  • C++ STL 优先队列 (priority_queue)
    std::priority_queue<queue>优先队列  1、第一个元素始终为最大元素。  2、有着类似于堆的特性,它可以在其中随时插入元素。  3、支持下标访问(随机访问迭代器)优先队列内部的实现需要依赖基础容器,该容器应可通过随机访问迭代器访问,并需要支持以下操作empty()si......
  • [IOT2050 question] Unable to listen on http://127.0.0.1:1880/ 端口被占用错误
    1.背景第一次连接node-red的时候,一直出现错误Unabletolistenonhttp://127.0.0.1:1880/。如下:2.原因分析估计是早前利用iot2050setup小工具把node-red设置为开机自动启动项了,导致1880端口一直被占用。3.验证首先查看端口是否真的被占用,利用sudonetstat-ltup命......
  • 集中式DTU与4、6、8、12、16回路DTU主控单元
    一、集中式DTU集中式DTU适用范围:集中式DTUAPT-6600站所终端适用于配电系统中变电站、户外开闭所、箱变、开关站、环网柜、配电室等场合中的检测和控制需求。集中式DTU主要功能:采集配电网实时运行数据进行处理和分析,通过通信通道(如光纤、载波、无线等),上传至配网主站,并......
  • 【技海探究·匠心筑梦】I‘mAlex的CSDN 128天创作纪念日:从初心到憧憬
    【技海探究·匠心筑梦】I‘mAlex的CSDN128天创作纪念日:从初心到憧憬......
  • Python123:找出不是两个数组共有的元素、矩阵运算、方阵循环右移(C语言)
    文章目录1、找出不是两个数组共有的元素2、矩阵运算3、方阵循环右移1、找出不是两个数组共有的元素题目:给定两个整型数组,本题要求找出不是两者共有的元素。输入格式:输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。‪‬‪......
  • ADS1256芯片说明
    本篇文章先总结一下24位的8通道24bit高精度采集的24位ADS1256,本篇文章不是纯粹的datasheet的抄袭,而是datasheet的总结,高度概括,以及对我们编程有用的思路,我大概看了一下网上流传的版本,大多数都是STM32,另外有一份是verilog不知道是谁写的,各个网都有,它是多通道采集,仅仅使用了一种模式......
  • Python创建异步任务队列库之Huey使用详解
    概要Huey是一个简单的Python库,用于创建异步任务队列。它的设计目标是简单易用,同时具备强大的功能。Huey可以轻松地将任务添加到队列中,然后在后台线程中处理这些任务,从而避免阻塞主线程。这使得Huey非常适合处理I/O密集型或长时间运行的任务。此外,Huey还支持任务的......
  • 单调队列(滑动窗口)
    154.滑动窗口-AcWing题库单调队列和单调栈就是在暴力的基础上进行优化,把永远用不到的元素删除。简而言之  就是比你好而且还在你后面的数你永远无法超越他。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'constintN=5e5+......
  • 12.阻塞赋值与非阻塞赋值语句的区别和规范
    (1)阻塞赋值“=”  直到现行的赋值语句完成,才允许下一条赋值语句的执行,在串行块(begin-end)中,各赋值语句将以它们在顺序块中的排列次序依次执行。(2)非阻塞赋值“<=”    在赋值开始时,计算赋值号右边的语句,赋值结束时,更新赋值号左边的语句,因此其他在同一时间的语句都会......