题目描述
给你二叉树的根节点 root,返回其节点值的层序遍历(即逐层地,从左到右访问所有节点)。
解题思路
使用 BFS(广度优先搜索)的思想,维护当前层的所有节点,逐层处理:
- 将根节点加入当前层节点列表
- 遍历当前层所有节点,收集它们的值
- 收集当前层所有节点的子节点作为下一层
- 重复步骤2-3直到没有下一层
核心代码
java
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
List<TreeNode> currentRowNodeList = new ArrayList<>();
currentRowNodeList.add(root);
while (true) {
// 收集当前层的值
List<Integer> currentRowValList = new ArrayList<>();
for (TreeNode node : currentRowNodeList) {
currentRowValList.add(node.val);
}
result.add(currentRowValList);
// 收集下一层节点
List<TreeNode> nextNodeList = new ArrayList<>();
for (TreeNode treeNode : currentRowNodeList) {
if (treeNode.left != null) {
nextNodeList.add(treeNode.left);
}
if (treeNode.right != null) {
nextNodeList.add(treeNode.right);
}
}
if (nextNodeList.isEmpty()) {
break;
}
currentRowNodeList = nextNodeList;
}
return result;
}
复杂度分析
- 时间复杂度: O(n),n 为二叉树节点数,每个节点访问一次
- 空间复杂度: O(n),最坏情况下需要存储一层的所有节点
示例验证
输入:[3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
算法按层级正确遍历,符合预期结果。