題目連接ide
題目大意:題意見112題,這裏就是找出全部路徑,而且返回全部路徑值。也就是要想辦法把路徑存起來。spa
法一:利用145的後序非遞歸遍歷,由於在後序非遞歸遍歷中,當要彈出某一個結點時,棧中所存的就是當前結點的全部父節點,也就是從根結點到當前結點的路徑,因此很快想到用後序非遞歸。這裏還有個要注意的點,就是在存入list的時候要新建對象,不然list存進去會是空值。代碼以下(耗時6ms):code
1 public List<List<Integer>> pathSum(TreeNode root, int sum) { 2 List<List<Integer>> list = new ArrayList<List<Integer>>(); 3 if(root == null) { 4 return list; 5 } 6 Stack<TreeNode> stack = new Stack<TreeNode>(); 7 stack.push(root); 8 TreeNode pre = null, cur = root.left; 9 List<Integer> listIn = new ArrayList<Integer>(); 10 listIn.add(root.val); 11 int cnt = root.val; 12 while(!stack.isEmpty()) { 13 while(cur != null) { 14 stack.push(cur); 15 listIn.add(cur.val); 16 cnt += cur.val; 17 cur = cur.left; 18 }//System.out.println(listIn); 19 cur = stack.peek(); 20 if(cur.left == null && cur.right == null && cnt == sum) { 21 //每次加入的時候新new一個對象,這個很重要 22 list.add(new ArrayList<Integer>(listIn)); 23 } 24 if(cur.right != null && pre != cur.right) { 25 cur = cur.right; 26 } 27 else { 28 cnt -= cur.val; 29 listIn.remove(listIn.size() - 1); 30 stack.pop(); 31 pre = cur; 32 cur = null; 33 } 34 } 35 return list; 36 }
法二:利用112的dfs辦法。只是回溯的時候多了list.remove的操做。代碼以下(耗時3ms):對象
1 public List<List<Integer>> pathSum(TreeNode root, int sum) { 2 List<List<Integer>> list = new ArrayList<List<Integer>>(); 3 List<Integer> listIn = new ArrayList<Integer>(); 4 if(root == null) { 5 return list; 6 } 7 int cnt = 0; 8 list = dfs(root, list, listIn, sum, cnt); 9 return list; 10 } 11 public static List<List<Integer>> dfs(TreeNode root, List<List<Integer>> list, List<Integer> listIn, int sum, int cnt) { 12 listIn.add(root.val); 13 cnt += root.val; 14 if(root.left == null && root.right == null) { 15 if(cnt == sum) { 16 list.add(new ArrayList<Integer>(listIn)); 17 } 18 return list; 19 } 20 if(root.left != null) { 21 list = dfs(root.left, list, listIn, sum, cnt); 22 //須要回溯remove,由於list是集合,在任何一處的修改都會修改原值,因此須要回溯後刪除 23 listIn.remove(listIn.size() - 1); 24 //不須要回溯減,由於cnt是基本類型,傳進去後的修改,並不會對原值有任何改變 25 //因此return後也不須要回溯,否則就多減了 26 // cnt -= root.val; 27 } 28 if(root.right != null) { 29 list = dfs(root.right, list, listIn, sum, cnt); 30 listIn.remove(listIn.size() - 1); 31 // cnt -= root.val; 32 } 33 return list; 34 }