今天在做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