今天在做Leetcode 102. 二叉树的层序遍历 时, 不管怎么试,每一层的输出都为空,如下图:
上述结果所使用的代码如下。
1 public List<List<Integer>> levelOrder(TreeNode root) { 2 if(root == null) return null; 3 List<List<Integer>> res = new ArrayList<>(); 4 Queue<TreeNode> queue = new LinkedList<>(); 5 queue.add(root); 6 TreeNode dummy = new TreeNode(Integer.MIN_VALUE); 7 queue.add(dummy); 8 ArrayList<Integer> level = new ArrayList<>(); 9 while(!queue.isEmpty()){ 10 TreeNode temp = queue.poll(); 11 if(temp.val == dummy.val) { 12 res.add(level); 13 System.out.println(level); 14 level.clear(); 15 if(!queue.isEmpty()) { 16 queue.offer(dummy); 17 } 18 }else{ 19 level.add(temp.val); 20 if(temp.left != null) { 21 queue.offer(temp.left); 22 } 23 if(temp.right != null) { 24 queue.offer(temp.right); 25 } 26 } 27 } 28 return res; 29 }
后来经过检查,用来存每一层元素的level,只在进入循环之前创建了一次,因此其地址值不变,如果将其加入到res中,当一层遍历结束加入到res之后,接着又执行了level.clear()方法,该clear方法每一次都把level中的元素清空,所以产生了每层输出都为空的结果,经过以上分析之后,把代码做出如下修改:
1 public List<List<Integer>> levelOrder(TreeNode root) { 2 if(root == null) return null; 3 List<List<Integer>> res = new ArrayList<>(); 4 Queue<TreeNode> queue = new LinkedList<>(); 5 queue.add(root); 6 TreeNode dummy = new TreeNode(Integer.MIN_VALUE); 7 queue.add(dummy); 8 ArrayList<Integer> level = new ArrayList<>(); 9 while(!queue.isEmpty()){ 10 TreeNode temp = queue.poll(); 11 if(temp.val == dummy.val) { 12 res.add(level); 13 level = new ArrayList<>(); 14 if(!queue.isEmpty()) { 15 queue.offer(dummy); 16 } 17 }else{ 18 level.add(temp.val); 19 if(temp.left != null) { 20 queue.offer(temp.left); 21 } 22 if(temp.right != null) { 23 queue.offer(temp.right); 24 } 25 } 26 } 27 return res; 28 }
修改完了之后,还是有点疑惑,然后去知乎搜了一下,看到了大神的解答https://www.zhihu.com/question/31203609