“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 十 天,点击查看活动详情”
力扣调试代码
麻了,调试力扣代码,找错误,代码感觉思路没问题,但一直说运行超时,看题解也找不出问题,力扣debug需要会员,就试着用本地的idea调试,
最后发现
int len = queue.size();这里一开始写的是dq.size(); 这里确实代码超时应该是陷入死循环,那么应该就是陷入while/for循环中,陷入while循环那么就应该是队列queue一直有值,而我们的代码中删除节点的只有for循环中的poll函数,那么就有可能是并没有执行for循环,那么就有可能是len为0,这样就无法执行到for循环。 TreeNode headNode = queue.poll();
debug过程
这里设置主函数为static方便调试, zigzagLevelOrder也设置成static的,直接就可以调用静态方法,因为static静态类中无法使用this调用,不需要创建函数对象。this指的是调用此函数的对象。 static不会改变类中成员的访问权限。不允许用来修饰局部变量。局部变量具有生命周期用完就会被回收,比如其方法在栈中调用进栈出栈,出栈后其局部变量就会被销毁回收,无法在调用其静态变量。
静态成员变量是存放在方法区静态区中,且生命周期特别长,如果不是共享数据尽量不要静态化,非静态变量会随着类的创建而创建,类的消失而消失。
涉及到的代码如下
public class Test {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
TreeNode root = new TreeNode(3);
TreeNode root9 = new TreeNode(9);
TreeNode root20 = new TreeNode(20);
TreeNode root15 = new TreeNode(15);
TreeNode root7 = new TreeNode(7);
root.left = root9;
root.right = root20;
root20.left = root15;
root20.right = root7;
List<List<Integer>> ans =zigzagLevelOrder(root);
System.out.println(ans);
}
public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ans = new LinkedList<List<Integer>>();
if(root == null)return ans;
boolean isLeft = true;
Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
queue.offer(root);
while(!queue.isEmpty()){
Deque<Integer> dq = new LinkedList<Integer>();
int len = queue.size();
for(int i=0;i<len;i++){
TreeNode headNode = queue.poll();
if(isLeft){
dq.offerLast(headNode.val);
}
else dq.offerFirst(headNode.val);
if(headNode.left!=null){
queue.offer(headNode.left);
}
if(headNode.right!=null){
queue.offer(headNode.right);
}
}
ans.add(new LinkedList<Integer>(dq));
isLeft = !isLeft;
}
return ans;
}
}