通过题目我们可以知道第一层是正着存,第二层是反着存,第三层又是正着存……所以我们可以发现奇数层都是争着存,偶数层都是反着存。然后问题就是要判断当前遍历的是奇数层还是偶数层。最后返回的是List<List< Integer>>集合,这个最外面list其实就是存放的就是每一层,它的size就表示的是到达了第几层,所以我们可以通过它的size的奇偶来判断是奇数层还是偶数层.
我们可以定义一个LinkedLIst,就拿样例来说,第二层是偶数层,打印的应该是[20,9],所以我们应该是将9,20依次从链表头部放进去。然后第三层是奇数层,应该打印[15,7],所以我们就从链表的尾部放进去。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//存结点的
Queue<TreeNode> queue = new LinkedList<>();
//存每一层
List<List<Integer>> res = new ArrayList<>();
if(root != null) queue.add(root);
while(!queue.isEmpty()) {
LinkedList<Integer> tmp = new LinkedList<>();
//n来判断是奇数层还是偶数层
int n=queue.size();
for(int i =0; i<n ; i++) {
TreeNode node = queue.poll();
//偶数层,从头放
if(res.size() % 2 == 0) tmp.addLast(node.val);
//奇数层,从尾放
else tmp.addFirst(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
res.add(tmp);
}
return res;
}
}
在队列中的放还是按照正常的先左后右,但是它的poll的值就要进到linkedlist里面,这个时候是从头放还是从尾放就要讨论了。