算法奇妙屋(十)-队列+宽搜(BFS)

⚙️个人专栏:

《Java算法时空: 图解手撕原理》 《 多线程 》 《JavaSE基础原理 》 《数据结构》

✨与其内耗自己,不如责备他人

一. 力扣 429. N 叉树的层序遍历

1. 题目

层序遍历的非递归实现, 用队列总没错!

2. 算法原理

3. 代码

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

二. 力扣 103. 二叉树的锯齿形层序遍历

1. 题目

题意给的很清楚,即偶数行的值要逆序

2. 算法原理

3. 代码

java 复制代码
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if (root == null) {
            return ret;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        boolean flag = true;
        while (!queue.isEmpty()) {
            flag = !flag;
            int num = queue.size();
            List<Integer> list = new ArrayList<>();
            while (num > 0) {
                TreeNode tmp = queue.poll();
                list.add(tmp.val);
                if (tmp.left != null) {
                    queue.offer(tmp.left);
                }
                if (tmp.right != null) {
                    queue.offer(tmp.right);
                }
                num--;
            }
            if (flag) {
                Collections.reverse(list);
            }
            ret.add(list);
        }
        return ret;
    }

三. 力扣 662. 二叉树最大宽度

1. 题目

题目意思是让求整颗二叉树中最大的宽度,需要注意的是:宽度是指最左和最右节点中间的距离,中间的空节点也计算在内

2. 算法原理

这里的pair我们可以理解为只是一个普通的泛型类

3. 代码

java 复制代码
    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> p1 = q.get(0);
            Pair<TreeNode, Integer> p2 = q.get(q.size() - 1);
            ret = Math.max(ret, p2.getValue() - p1.getValue() + 1);
            // 加入下一层
            List<Pair<TreeNode, Integer>> tmp = new ArrayList<>();
            for (Pair<TreeNode, Integer> p: q) {
                TreeNode node = p.getKey();
                int n = p.getValue();
                if (node.left != null) {
                    tmp.add(new Pair<TreeNode, Integer>(node.left, 2 * n));
                }
                if (node.right != null) {
                    tmp.add(new Pair<TreeNode, Integer>(node.right, 2 * n + 1));
                }
            }
            q = tmp;
        }
        return ret;
    }

四. 力扣 515. 在每个树行中找最大值

1. 题目

这道题应该是这个系列最简单的了, 找每层的最大值, 然后加入到列表中

2. 算法原理

这道题我们直接根据上面层序遍历的模版,然后只需要在便利每层时,加上一个求最大值的表达式即可,可以说是四个题中最简单的

3. 代码

java 复制代码
    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 n = queue.size();
            int tmp = Integer.MIN_VALUE;
            while (n > 0) {
                TreeNode node = queue.poll();
                tmp = Math.max(tmp, node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
                n--;
            }
            ret.add(tmp);
        }
        return ret;
    }
相关推荐
凡人叶枫几秒前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
摇滚侠3 分钟前
JavaSE 和 JavaEE 是什么意思
java·java-ee
想带你从多云到转晴5 分钟前
03、JAVAEE---多线程(三)
java
怪兽学LLM19 分钟前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪25 分钟前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
CC数学建模25 分钟前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
matlabgoodboy25 分钟前
计算机java程序代写python代码编写c/c++代做qt设计php开发matlab
java·c语言·python
leo__52032 分钟前
MATLAB实现牧羊人算法
开发语言·算法·matlab
视觉小萌新37 分钟前
C++利用libmicrohttpd制作交互网页端——C1
java·c++·交互
Gauss松鼠会39 分钟前
【GaussDB】GaussDB SMP特性调优详解
java·服务器·前端·数据库·sql·算法·gaussdb