借鉴了牛客讨论区和Leetcode的题解。加了注释方便理解
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) { // write code here ArrayList<ArrayList<Integer>> res=new ArrayList<>(); if(root==null) return res; Deque<Integer> path=new ArrayDeque<>(); //jdk建议这样实现栈 ,双向队列 dfs(root,sum,path,0,res); //源头开始dfs搜索 return res; } //深度优先搜索 public void dfs(TreeNode root,int sum,Deque<Integer> path, int total,ArrayList<ArrayList<Integer>> res){ if(root==null) return ; path.addLast(root.val); //把当前节点值加入 队列中 total+=root.val; //计算每条路径的总和 if(root.left==null &&root.right==null){ //这里表示已经到达叶子节点 if(sum==total) res.add(new ArrayList<>(path)); path.removeLast(); // 回溯,寻找下一个 符合的 return; //避免进入下面的查找 } //跳过了上面的说明,还未到达叶子节点,继续查找 dfs(root.left,sum,path,total,res); dfs(root.right,sum,path,total,res); //回溯 ,上面的是if判断,和这里的不同 path.removeLast(); }