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的大小

猜你喜欢

转载自www.cnblogs.com/hiyashinsu/p/10740633.html