Java 使用两个队列的层次顺序遍历二叉树

Java 使用两个队列的层次顺序遍历二叉树,java,tree,binary-tree,tree-traversal,Java,Tree,Binary Tree,Tree Traversal,Leetcode问题: 我有两个队列,我清空第一个队列(q),同时向第二个队列(q2)添加元素,这样我可以得到级别。当第一个队列为空时,我将其传递给函数以创建该级别的ArrayList并将其添加到结果值中,如果q2为空,则意味着没有添加任何内容,因此我们可以中断循环并返回函数。我必须手动添加第一个节点。问题是只添加了中间层,而没有添加其他层 /** * Definition for a binary tree node. * public class TreeNode { * in

Leetcode问题:

我有两个队列,我清空第一个队列(q),同时向第二个队列(q2)添加元素,这样我可以得到级别。当第一个队列为空时,我将其传递给函数以创建该级别的ArrayList并将其添加到结果值中,如果q2为空,则意味着没有添加任何内容,因此我们可以中断循环并返回函数。我必须手动添加第一个节点。问题是只添加了中间层,而没有添加其他层

/**
 * 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);
    }
}
/**
*二叉树节点的定义。
*公共级树节点{
*int-val;
*左树突;
*特雷诺德右翼;
*TreeNode(){}
*树节点(int-val){this.val=val;}
*TreeNode(内部值,TreeNode左,TreeNode右){
*this.val=val;
*this.left=左;
*这个。右=右;
*     }
* }
*/
类解决方案{
公共列表级别顺序(TreeNode根){
if(root==null){
返回null;
}
List returnList=new ArrayList();
队列q=新的LinkedList();
q、 添加(根);
List templast=new ArrayList();
添加(root.val);
returnList.add(圣堂武士);
while(true){
队列q2=新的LinkedList();
而(!q.isEmpty()){
TreeNode节点=q.remove();
if(node.left!=null){
q2.添加(节点左侧);
}
if(node.right!=null){
q2.添加(节点右侧);
}
}
if(q2.isEmpty()){
打破
}
q=q2;
地址列表(返回列表,第2季度);
}
退货清单;
}
公共静态void addList(列表返回列表,队列q2){
List templast=new ArrayList();
int size=q2.size();
对于(int i=0;i
问题与这部分代码有关:

    q = q2;
    addList(returnList, q2);
函数
addList
将清空给定队列
q2
,并对其调用
remove
。由于
q
已成为对同一队列的引用,您已清空
q
,因此外循环的下一次迭代将不会进入内循环,并以
中断退出外循环

为避免发生这种情况,请确保
remove
调用未在
q
上执行:复制:

    q = new LinkedList<>(q2);
    addList(returnList, q2);
q=新链接列表(q2);
地址列表(返回列表,第2季度);
或者,或者:

    q = q2;
    addList(returnList, new LinkedList<>(q2));
q=q2;
addList(returnList,newlinkedlist(q2));