-
题目描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
解题思路:出节点的左右节点,放入队尾。然后必须取出每层的节点数 size,当循环了 size 之后,则表明该层的遍历结束。
队列先进先出,很符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
详细图解:
-
存储根节点,作为循环弹出队列的次数
-
计算存储队列的长度
- 将根节点出队列,取出节点的值,放入层序列表中
- 然后判断该结点是否有左右节点,将左右节点入队列
- 队列长度为 1,进行完 1 次循环结束,将该层的列表存入结果列表
- 计算队列的长度为 2
- 弹出 4 这个节点,取出值放入层序队列,并且将其左右节点入队
- 取出 5 这个节点进行同样的步骤
- 将第 2 层的列表存入结果列表
相信大家已经能很清晰的理解步骤啦!
Java代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 存放遍历结果
List<List<Integer>> ret = new ArrayList<List<Integer>>();
// 判断是否为空
if (root == null) {
return ret;
}
// 定义一个队列,用于存储将要处理的二叉树节点
Queue<TreeNode> queue = new LinkedList<TreeNode>();
// 放入根节点作为初始节点
queue.offer(root);
// 开始层序遍历二叉树,知道队列为空
while (!queue.isEmpty()) {
// 存放当前层节点的值
List<Integer> level = new ArrayList<Integer>();
// 获取当前层节点的数量
int currentLevelSize = queue.size();
// 处理当前层的每一个节点
for (int i = 1; i <= currentLevelSize; ++i) {
// 取出并移除队列中的节点
TreeNode node = queue.poll();
// 将节点值放入队列
level.add(node.val);
if (node.left != null) {
// 判断是否有左节点,如果有则存入处理节点的队列
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
// 将当前层的节点值存入结果队列
ret.add(level);
}
return ret;
}
}