102.二叉树的层序遍历
思路1(一个队列):
- 创建一个队列,并把根节点放进去
- 在while循环中创建一个链表,每次while循环一次重置一次链表。
- 用 size 记录此时队列的大小,根据队列的大小(即元素的个数)进行for循环,得出下一层所有的元素并放入队列,把值同时存入创建的链表中,因为用的是poll()方法,所以上一层的元素全部被清空了
- 在while中的链表重置之前,把它放入所要返回的链表中,最后结束 返回题目所要返回的链表 即可
代码实现
/**
* 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>> list = new LinkedList<>();
if (root == null) return list;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
List<Integer> ret = new LinkedList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
ret.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
list.add(ret);
}
return list;
}
}
思路2(两个队列):
一个队列存当前层元素,另一个存下一层元素
- 创建链表,创建队列1和队列2,队列1存放根节点,此时根节点即是第一层元素
- 把第一层元素放入链表中,再根据队列1,把第二层元素求出来放到队列2中,如果队列1空了,则代表第一层元素已全部用完,则把链表存入 要返回的链表 中,把队列2的元素给队列1,队列2置空,把链表也置空
- 重复循环操作直到元素遍历完
代码实现
/**
* 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) {
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
List<List<Integer>> list = new LinkedList<>();
List<Integer> res = new LinkedList<>();
if (root == null) return list;
queue1.offer(root);
while (!queue1.isEmpty()) {
TreeNode node = queue1.poll();
res.add(node.val);
if (node.left != null) {
queue2.offer(node.left);
}
if (node.right != null) {
queue2.offer(node.right);
}
if (queue1.isEmpty()) {
queue1 = queue2;
queue2 = new LinkedList<>();
list.add(res);
res = new LinkedList<>();
}
}
return list;
}
}