import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * * @param root TreeNode类 * @param sum int整型 * @return int整型ArrayList<ArrayList<>> */ ArrayList<Integer> path = new ArrayList<Integer>(); ArrayList<ArrayList<Integer>> res =new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) { dfs(root,0,sum); return res; } public void dfs(TreeNode root,int cursum,int target){ if(root == null) return; cursum += root.val; path.add(root.val); if(root.left == null && root.right == null){ if(cursum == target) res.add(new ArrayList(path)); }else{ //这里不知道为什么 先 right 后 left 最后一个用例过不去 dfs(root.left,cursum,target); dfs(root.right,cursum,target); } path.remove(path.size()-1); } }
temp 数组 每次添加的时候为了污染
使用 res.add(new ArrayList(temp))
递归程序为 void , 变量保存在 传入的参数当中。
每次遍历可以记录路径 也可以计算total, 我当时想的是返回的时候确认 total ==sum 再返回记录当前的值。 有点费劲。 还是一边遍历 一边记录好。
遍历到最后一个 temp需要去除 temp记录的是当前路径
当传入参数为int类型等 这个值并不会根据后面递归的变化而改变 例如 total 即使经过左节点的递归之后 total在右节点递归时 还是 开始的值
但是传入 链表 数组等这种地址时 其中 的值会随着递归改变 所有需要在递归完当前节点后将temp最后一个删除。
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * * @param root TreeNode类 * @param sum int整型 * @return int整型ArrayList<ArrayList<>> */ public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) { ArrayList<ArrayList<Integer>> result = new ArrayList<>(); psum(root, 0,sum, new ArrayList<>(), result); return result; } public void psum(TreeNode root, int total, int sum, ArrayList<Integer> temp, List<ArrayList<Integer>> res){ if(root == null) return; total = total + root.val; temp.add(new Integer(root.val)); if(root.left == null && root.right == null){ if(total == sum){ res.add(new ArrayList(temp)); // 新的 } temp.remove(temp.size() - 1); return; } psum(root.left, total, sum, temp, res); psum(root.right, total, sum, temp, res); temp.remove(temp.size() - 1); } }