二叉树的层序遍历--思路===bfs的应用,以及java中队列的方法实操

层序遍历的思路



java 复制代码
package siyangyuan;


import java.util.*;

/**
 * Class Name :LevelOrderTraversal
 * Package :siyangyuan
 * Description:
 *
 * @Author: Mr.chunxugao
 * Create: 2026-03-15- 9:56
 * @Version:v1.0
 */

class BSTNode{
    int val;
    BSTNode left;
    BSTNode right;
    BSTNode(){}

    BSTNode(int x){
        this.val=x;
    }
    BSTNode(int x,BSTNode left,BSTNode right){
        this.val=x;
        this.left=left;
        this.right=right;
    }
}
//层序遍历
public class LevelOrderTraversal {
    public static void main(String[] args) {
        // 构建测试二叉树
        //        3
        //       / \
        //      9  20
        //        /  \
        //       15   7
        BSTNode root = new BSTNode(3);
        root.left = new BSTNode(9);
        root.right = new BSTNode(20);
        root.right.left = new BSTNode(15);
        root.right.right = new BSTNode(7);

        List<List<Integer>> result = levelOrder(root);
        System.out.println("层序遍历结果:" + result);
    }


    //层序遍历,适用bfs
    public static List<List<Integer>> levelOrder(BSTNode root){
        List<List<Integer>> res=new ArrayList<>();

        if (root==null) return res;

        //  核心:用队列存储每一层的节点
        Queue<BSTNode> queue=new LinkedList<>();
        queue.offer(root);

//        步骤 4:循环遍历(队列为空时结束)
//        只要队列里还有节点,就一直遍历。
        while (!queue.isEmpty()){
            //        步骤 5:分层处理(最关键!)
    //        先获取当前队列的大小 → 这就是当前层的节点总数
            int n=queue.size();
            //保存当前层的节点值
            List<Integer> curqueue=new ArrayList<>();
    //        循环这个次数,把当前层所有节点一次性处理完
            for (int i=0;i<n;i++){
                //        处理逻辑:
                //        节点出队
               BSTNode curNode= queue.poll();
                // 把节点值加入当前层列表
                curqueue.add(curNode.val);
                //左、右子节点不为空 → 入队(给下一层用)
                if (curNode.left!=null)
                {
                    queue.offer(curNode.left);
                }
                if (curNode.right!=null){
                    queue.offer(curNode.right);
                }
            }
    //        步骤 6:收集结果
    //        当前层遍历完,把这一层的列表加入总结果集。
                    res.add(curqueue);
        }
        return res;
    }
}

BFS的常规代码

java 复制代码
package siyangyuan;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

// 二叉树节点
class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int val) { this.val = val; }
}

public class LevelOrder {
    // 🔥 BFS 层序遍历(万能常规模板)
    public static List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) return res;

        // 1. 队列初始化
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        // 2. 核心循环(固定不变)
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            List<Integer> level = new ArrayList<>();

            // 3. 遍历当前层(固定不变)
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                level.add(node.val);

                // 4. 子节点入队(固定不变)
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
            res.add(level);
        }
        return res;
    }

    public static void main(String[] args) {
        // 测试树
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(9);
        root.right = new TreeNode(20);
        root.right.left = new TreeNode(15);
        System.out.println(levelOrder(root));
    }
}
相关推荐
小夏coding3 小时前
从"一把梭"到"精妙拆解" —— 滑动窗口计时框架的设计演进
java·后端
MacroZheng4 小时前
同事问我:"Claude Code经常失忆,不怕它把项目搞炸?",我:"怕,三个Markdown文件给它装个永不丢失的外置大脑!"
java·人工智能·后端
学习星球5 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
十年Java程序媛5 小时前
深度实战:JDK21 虚拟线程 + HikariCP 生产正确配比、坑点、监控全套
java·spring boot
xiaoqiMikko5 小时前
有人在搜一个不存在的 Tomcat 版本
java·tomcat
用户3126874877209 小时前
ConcurrentHashMap 怎么保证线程安全?从分段锁到 CAS+synchronized
java
vipxieliang9 小时前
ValidX vs Apache Commons Validator:功能与性能对比
java·spring boot
SimonKing9 小时前
升级Spring Boot 4后,从 Jackson 2 到 3,到底有哪些变化
java·后端·程序员
吃饱了得干活9 小时前
一篇讲清楚Spring Boot:自动装配、启动器、过滤器、拦截器、设计模式
java·spring boot·后端
alphaTao11 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode