使用两个队列的层序遍历二叉树
Level order traversal binary tree using two queues
力扣题:https://leetcode.com/problems/binary-tree-level-order-traversal/
我有两个队列,我清空第一个队列 (q),同时向第二个队列 (q2) 添加元素,这样我就可以获得关卡。当第一个队列为空时,我将其传递给函数以创建该级别的 ArrayList 并添加到我的结果值中,如果 q2 为空则意味着没有添加任何内容,因此我们可以跳出循环并 return 函数。我必须手动添加第一个节点。问题是只加了中层,其余的没有加。
/**
* 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) {
if(root == null) {
return null;
}
List<List<Integer>> returnList = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
List<Integer> tempList = new ArrayList<>();
tempList.add(root.val);
returnList.add(tempList);
while(true) {
Queue<TreeNode> q2 = new LinkedList<>();
while(!q.isEmpty()) {
TreeNode node = q.remove();
if(node.left != null) {
q2.add(node.left);
}
if(node.right != null) {
q2.add(node.right);
}
}
if(q2.isEmpty()) {
break;
}
q = q2;
addList(returnList, q2);
}
return returnList;
}
public static void addList(List<List<Integer>> returnList, Queue<TreeNode> q2) {
List<Integer> tempList = new ArrayList<>();
int size = q2.size();
for(int i = 0; i < size; i++) {
int val = q2.remove().val;
System.out.println(val);
tempList.add(val);
}
returnList.add(tempList);
}
}
问题与这部分代码有关:
q = q2;
addList(returnList, q2);
函数 addList
将清空给定队列 q2
,对其调用 remove
。由于q
已经成为对相同队列的引用,你清空了q
,所以外循环的下一次迭代不会进入内循环,并使用 break
.
退出外循环
为避免这种情况发生,请确保 remove
调用未在 q
上执行:制作副本:
q = new LinkedList<>(q2);
addList(returnList, q2);
或者,或者:
q = q2;
addList(returnList, new LinkedList<>(q2));
力扣题:https://leetcode.com/problems/binary-tree-level-order-traversal/
我有两个队列,我清空第一个队列 (q),同时向第二个队列 (q2) 添加元素,这样我就可以获得关卡。当第一个队列为空时,我将其传递给函数以创建该级别的 ArrayList 并添加到我的结果值中,如果 q2 为空则意味着没有添加任何内容,因此我们可以跳出循环并 return 函数。我必须手动添加第一个节点。问题是只加了中层,其余的没有加。
/**
* 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) {
if(root == null) {
return null;
}
List<List<Integer>> returnList = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
List<Integer> tempList = new ArrayList<>();
tempList.add(root.val);
returnList.add(tempList);
while(true) {
Queue<TreeNode> q2 = new LinkedList<>();
while(!q.isEmpty()) {
TreeNode node = q.remove();
if(node.left != null) {
q2.add(node.left);
}
if(node.right != null) {
q2.add(node.right);
}
}
if(q2.isEmpty()) {
break;
}
q = q2;
addList(returnList, q2);
}
return returnList;
}
public static void addList(List<List<Integer>> returnList, Queue<TreeNode> q2) {
List<Integer> tempList = new ArrayList<>();
int size = q2.size();
for(int i = 0; i < size; i++) {
int val = q2.remove().val;
System.out.println(val);
tempList.add(val);
}
returnList.add(tempList);
}
}
问题与这部分代码有关:
q = q2;
addList(returnList, q2);
函数 addList
将清空给定队列 q2
,对其调用 remove
。由于q
已经成为对相同队列的引用,你清空了q
,所以外循环的下一次迭代不会进入内循环,并使用 break
.
为避免这种情况发生,请确保 remove
调用未在 q
上执行:制作副本:
q = new LinkedList<>(q2);
addList(returnList, q2);
或者,或者:
q = q2;
addList(returnList, new LinkedList<>(q2));