113.Path Sum II

題目連接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     }
View Code

法二:利用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     }
View Code
相關文章
相關標籤/搜索