层序遍历的思路



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));
}
}