leetcode 103 Z字形层次遍历
题目:
就是层次遍历分层输出的变种,左右来回倒。有了leetcode 199的经验,做这题完全不在话下。但实际写的时候,还是遇到了些问题,说明对199的代码没有理解透彻。
1 class Solution { 2 public List<List<Integer>> zigzagLevelOrder(TreeNode root) { 3 List<List<Integer>> ans = new ArrayList<>(); 4 Deque<TreeNode> dq = new ArrayDeque<>(); 5 if (root == null) { 6 return ans; 7 } 8 dq.addLast(root); 9 boolean l2r = true; 10 while (!dq.isEmpty()) { 11 List<Integer> ls = new ArrayList<Integer>(); 12 int n = dq.size(); 13 for (int i = 0; i < n; i++) { 14 TreeNode tmp = dq.getFirst(); 15 if (!l2r) { 16 ls.add(0, tmp.val); 17 } 18 else { 19 ls.add(tmp.val); 20 } 21 dq.removeFirst(); 22 if (tmp.left != null) { 23 dq.addLast(tmp.left); 24 } 25 if (tmp.right != null) { 26 dq.addLast(tmp.right); 27 } 28 } 29 ans.add(ls); 30 l2r = !l2r; 31 } 32 return ans; 33 } 34 }
问题总结如下:
1. 对于根节点的处理,只需要将根节点加入队列初始化即可。无需记录并添加到结果列表里,因为后面while循环里会自动添加根节点,否则就重复添加了。
2. while循环中的for循环,需要注意循环条件。刚开始图快,直接写成了i < dq.size(),结果显然不对。因为在for循环里有修改dq的操作,可能会改变dq的大小。所以必须事先记录最开始的dq的大小。