算法题目---队列+宽搜(BFS)

(一).基础概念

队列,这个就不用多介绍了。在前面介绍数据结构的时候,介绍过。

宽搜,就是宽度优先搜索,和层序遍历一样。宽搜广泛应用于树型结构,图论,最短路问题,迷宫问题等等。宽搜属于搜索类的算法,还有一个就是深搜

(二).具体题目

1.N叉树的层序遍历

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

解法:BFS

java 复制代码
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> ret=new ArrayList<>();
        if (root==null){
            return ret;
        }
        Queue<Node> queue=new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()){
            List<Integer> list=new ArrayList<>();
            int sz=queue.size();
            for (int i = 0; i < sz; i++) {
                Node poll = queue.poll();
                list.add(poll.val);
                for(Node node:poll.children){
                    queue.add(node);
                }
            }
            ret.add(list);
        }
        return ret;
    }

2.二叉树的锯齿形层次遍历

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

解法:使用队列进行层次遍历

java 复制代码
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ret=new ArrayList<>();
        if (root==null){
            return ret;
        }
        Queue<TreeNode> queue=new ArrayDeque<>();
        boolean isReverse=false;
        queue.add(root);
        while (!queue.isEmpty()){
            List<Integer> list=new ArrayList<>();
            int sz=queue.size();
            for (int i = 0; i < sz; i++) {
                TreeNode poll = queue.poll();
                if (poll.left!=null){
                    queue.add(poll.left);
                }
                if (poll.right!=null){
                    queue.add(poll.right);
                }
                list.add(poll.val);
            }
            if (!isReverse){
                isReverse=true;
            }else{
                Collections.reverse(list);
                isReverse=false;
            }
            ret.add(list);
        }
        return ret;
    }

3.二叉树的最大宽度

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

解法:利用数组存储二叉树的方式,进行编号

java 复制代码
    public int widthOfBinaryTree(TreeNode root) {
        List<Pair<TreeNode,Integer>> arr=new ArrayList<>();  //使用数组模拟队列
        int ans=1;  //记录最终结果
        arr.add(new Pair<>(root,1));
        while (!arr.isEmpty()){

            //更新这一层的宽度
            Pair<TreeNode,Integer> t1=arr.get(0);
            Pair<TreeNode,Integer> t2=arr.get(arr.size()-1);
            ans = Math.max(ans,t2.getValue()-t1.getValue()+1);

            //让下一层入队
            List<Pair<TreeNode,Integer>> temp=new ArrayList<>();
            for(Pair<TreeNode,Integer> t:arr){
                TreeNode node=t.getKey();
                Integer index=t.getValue();
                if (node.left!=null){
                    temp.add(new Pair(node.left,2*index));
                }
                if (node.right!=null){
                    temp.add(new Pair(node.right,2*index+1));
                }
            }
            arr=temp;//让新的数组覆盖之前的数组
        }
        return ans;
    }

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

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

解法:使用队列,利用层次遍历,统计出每一层的最大值

java 复制代码
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> ret=new ArrayList<>();
        if (root==null){
            return ret;
        }
        Queue<TreeNode> queue=new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()){
            int sz=queue.size();
            int max=Integer.MIN_VALUE;
            for (int i = 0; i < sz; i++) {
                TreeNode poll = queue.poll();
                if (poll.left!=null){
                    queue.add(poll.left);
                }
                if (poll.right!=null){
                    queue.add(poll.right);
                }
                if (max<poll.val){
                    max=poll.val;
                }
            }
            ret.add(max);
        }
        return ret;
    }
相关推荐
果丁智能8 小时前
智慧校园一卡通深度融合方案:基于超级SIM卡的手机碰一碰智能开锁技术落地实践
数据结构·人工智能·python·科技·算法·智能家居·信息与通信
满怀冰雪8 小时前
第13篇-栈算法入门-括号匹配-表达式与单调栈基础
java·算法
TCW11218 小时前
AI底层系列:用C++实现线性代数的公式推导与算法设计-基础篇-5.矩阵方程
人工智能·线性代数·算法
叫我:松哥8 小时前
基于机器学习和flask的体育健身风险智能分析系统,系统集成DeepSeek、聚类算法、分类算法等,准确率达90%
人工智能·python·神经网络·算法·机器学习·flask·聚类
wabs6668 小时前
关于动态规划【0-1背包思想在实际问题中是怎么转化的?】
算法·动态规划
阿文的代码库8 小时前
欧拉回路与欧拉路径的算法流程演示
算法
汤姆yu8 小时前
云知声 U2 原生智能体大模型深度解析
大数据·人工智能·算法·ai·大模型·多模态·智能体
syt_biancheng8 小时前
贪心算法(1)---简介
算法·贪心算法
小白小宋9 小时前
【PUSCH番外篇】5G NR 相位补偿与频移校正:原理、流程与工程实现
算法·5g·matlab·信息与通信·信号处理
满怀冰雪9 小时前
第15篇-链表基础-反转链表-合并链表与快慢指针
java·算法·链表