1. 问题描述
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
2. 解题思路
① 判断根节点 root 是否为空,若为空则直接返回 new ArrayList<>()
② 当排除根节点为空的情况时,需要两个变量:
(1)存放最终层序遍历节点值的 res
(2)存放树节点的双端队列 q
③ 循环遍历每一层
其他的部分和104. 二叉树的最大深度
差不多
参考
https://blog.csdn.net/hutianle/article/details/123312447?spm=1001.2014.3001.5502
3. 代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 存放层序遍历的节点值
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
// 双端队列存放树的结点
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
// 记录每一层的节点数
int n = q.size();
// 暂存每一层的节点值
List<Integer> temp_res = new ArrayList<>();
// 遍历当前层
for (int i = 0; i < n; i++) {
TreeNode temp_node = q.poll();
temp_res.add(temp_node.val);
// 下一层的左子树入队
if (temp_node.left != null) {
q.offer(temp_node.left);
}
// 下一层的右子树入队
if (temp_node.right != null) {
q.offer(temp_node.right);
}
}
res.add(temp_res);
}
return res;
}
}