题目的要求,大白话说就是:把指针指向同层的右侧节点
提到同层,自然就要想到层序遍历,自然是队列实现
问题是需要分层
所以采用之前题目用的那种计数的方式
class Solution { public Node connect(Node root) { if(root==null) {return root;} Queue<Node> queue=new ArrayDeque<>(); Node fake=root; queue.add(root); while(queue.size()!=0) { int count=queue.size(); for(int n=0;n<count;n++) { fake=queue.poll(); if(n<count-1) { fake.next=queue.peek(); } if(fake.left!=null) { queue.add(fake.left); } if(fake.right!=null) { queue.add(fake.right); } } } return root; } }
几个碰到的问题:
1.前面要加对于空树的判断,要不会搞出null.next这种错误
2.循环跳出的条件是什么?是queue.size()!=0,即所有元素已经进了队列并且弹出了。我一开始写成了fake!=null这个条件。仔细走一下这个顺序,发现fake会一直都是最后一个节点,跑成了死循环。但其实加个判断也能解决,但其实判断的条件就是队列排空。
3.这个地方
if(n<count-1) { fake.next=queue.peek(); }
首先是,好在有一个peek的方法,使我们不用搞front Node和back Node来把先后排出队列的节点连起来。
其次是为什么要加if(n<count-1)这个计数的条件。因为最后一个元素的peek会peek到下一层去。。。
由此发现,这种循环中,判断循环条件是什么任然是一个很棘手的问题。