【算法】【优选算法】宽搜(BFS)中队列的使用

目录

一、429. N叉树的层序遍历

题目链接:429.N叉树的层序遍历

题目描述:

题目解析:

  • 层序遍历N叉树,每一层的节点是由null分开
  • 每一层节点的val值放入一个数组中,最后返回一个二维数组,每行就是对应层数据

解题思路:

  • 我们将每一层的节点放入一个队列中,每次队列出节点的时候就将这个节点的孩子节点入队
  • 因为节点数范围是包含0的,所有当根节点为null时,返回空二维数组
  • 因为出队列伴随着入队,所以要区分每层节点,在出该层队列中节点前,先求一下长度,然后出这个长度对应节点个数即可。
  • 在入队列的时候,因为使用null区分,所以要将null节点排除不入队列。

解题代码:

java 复制代码
//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null) return ret;//节点数为0
        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int sz = queue.size();//每层节点个数

            List<Integer> tmp = new ArrayList<>();//每层节点

			//下一层节点
            for(int i = 0; i < sz; i++) {
                Node node = queue.poll();
                tmp.add(node.val);
                for(Node x : node.children) {
                    if(x != null) {
                        queue.offer(x);
                    }
                }
            }

            ret.add(tmp);
        }
        return ret;
    }
}

二、103.⼆叉树的锯⻮形层序遍历

题目链接:103.⼆叉树的锯⻮形层序遍历

题目描述:

题目解析:

  • 层序遍历二叉树,每一层节点的val值放入一个数组中,根节点为第一层,奇数层顺序放入,偶数层逆序放入,最后返回一个二维数组,每行就是对应层数据

解题思路:

  • 我们将每一层的节点放入一个队列中,每次队列出节点的时候就将这个节点的孩子节点入队
  • 因为节点数范围是包含0的,所有当根节点为null时,返回空二维数组
  • 因为出队列伴随着入队,所以要区分每层节点,在出该层队列中节点前,先求一下长度,然后出这个长度对应节点个数即可。
  • 在入队列的时候,因为使用null区分,所以要将null节点排除不入队列。
  • 使用一个变量标记一下当前的层数,最后一维数组入结果数组是,如果是偶数层数就逆序。

解题代码:

java 复制代码
//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null) return ret;//节点数为0
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int level = 1;//层

        //入队列,出队列
        while(!queue.isEmpty()) {
            int sz = queue.size();
            List<Integer> tmp = new ArrayList<>();
            
            for(int i = 0; i < sz; i++) {
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if(node.left != null) queue.offer(node.left);
                if(node.right != null) queue.offer(node.right);
            }
            //偶层数 逆序
            if(level % 2 == 0) Collections.reverse(tmp);
            ret.add(tmp);
            level++;
        }
        return ret;
    }
}

三、662.⼆叉树最⼤宽度

题目链接:662.⼆叉树最⼤宽度

题目描述:

题目解析:

  • 求二叉树中每层的长度的最大值
  • 每层的长度指:当前层第一个不是null的节点与最后一个不是null的节点之间 的 节点个数包含null节点
  • 节点数不会是0个

解题思路:

  • 我们直接将null节点填入,不仅麻烦还会超时。
  • 所以我们将二叉树看成是数组存储的,将每个节点的下标给带上,与节点构成一个键值对,放入队列中。
  • 因为我们要求长度:需要拿到每层节点第一个节点和最后一个节点的下标,那么队列不能满足需求,使用一个数组来模拟队列存储。
  • 每次在下一层节点入队前,先拿到第一个节点和最后一个节点的下标,求程度与结果的较大值。
  • 这个数组只存一层的数据,下一层我们使用一个临时数组来存储,最后赋值即可。
  • 遍历数组,将下一层不为空的节点放入临时数组。

解题代码:

java 复制代码
//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        int ret = 0;
        List<Pair<TreeNode, Integer>> queue = new ArrayList<>();//数组只存每一层节点与对应坐标
        queue.add(new Pair<>(root, 0));//根节点入队

        while(!queue.isEmpty()) {
            //数组最后元素与第一个元素的value域,求当前层的长度
            ret = Math.max(ret, queue.get(queue.size() - 1).getValue() - queue.get(0).getValue() + 1);
            //数组记录下一层节点
            List<Pair<TreeNode, Integer>> tmp = new ArrayList<>();
            for(Pair<TreeNode, Integer> node : queue) {
                if(node.getKey().left != null) tmp.add(new Pair<>(node.getKey().left, node.getValue() * 2 + 1));
                if(node.getKey().right != null) tmp.add(new Pair<>(node.getKey().right, node.getValue() * 2 + 2));
            }
            queue = tmp;
        }
        return ret;
    }
}

四、515.在每个树⾏中找最⼤值

题目链接:515.在每个树⾏中找最⼤值

题目描述:

题目解析:

  • 将二叉树中每层节点的value的最大值放入要返回的结果数组中
  • value域的值范围是int的取值范围,包含负数的

解题思路:

  • 我们将每一层的节点放入一个队列中,每次队列出节点的时候就将这个节点的孩子节点入队
  • 因为节点数范围是包含0的,所有当根节点为null时,返回空数组
  • 因为出队列伴随着入队,所以要区分每层节点,在出该层队列中节点前,先求一下长度,然后出这个长度对应节点个数即可。
  • 在出队列前,先使用一个变量赋值为int的最小值,在每次出节点前,变量更新为该节点的value与变量的更大值。
  • 在入队列的时候,要将null节点排除不入队列。

解题代码:

java 复制代码
//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public List<Integer> largestValues(TreeNode root) {
        List<Integer> ret = new ArrayList<>();
        if(root == null) return ret;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int sz = queue.size();
            int max = Integer.MIN_VALUE;
            for(int i = 0; i < sz; i++) {
                TreeNode node = queue.poll();
                max = Math.max(node.val, max);
                if(node.left != null) queue.offer(node.left);
                if(node.right != null) queue.offer(node.right);
            }
            ret.add(max);
        }
        return ret;
    }
}
相关推荐
爱思德学术21 分钟前
中国计算机学会(CCF)推荐学术会议-B(交叉/综合/新兴):BIBM 2025
算法
冰糖猕猴桃32 分钟前
【Python】进阶 - 数据结构与算法
开发语言·数据结构·python·算法·时间复杂度、空间复杂度·树、二叉树·堆、图
lifallen1 小时前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
liujing102329292 小时前
Day04_刷题niuke20250703
java·开发语言·算法
2401_881244402 小时前
Treap树
数据结构·算法
乌萨奇也要立志学C++2 小时前
二叉树OJ题(单值树、相同树、找子树、构建和遍历)
数据结构·算法
网安INF2 小时前
深度学习中的逻辑回归:从原理到Python实现
人工智能·python·深度学习·算法·逻辑回归
wsxqaz2 小时前
浏览器原生控件上传PDF导致hash值不同
算法·pdf·哈希算法
NAGNIP3 小时前
Transformer注意力机制——MHA&MQA&GQA
人工智能·算法
摘星编程3 小时前
多模态AI Agent技术栈解析:视觉-语言-决策融合的算法原理与实践
人工智能·算法·多模态ai·视觉语言融合·ai决策算法