深度优先 回溯法
public class Offer34 {
/** 先创建一个List用来存放路径*/
private List<List<Integer>> result = new ArrayList<>();//结果集
private List<Integer> path = new ArrayList<>();//设置一个变量,来判断目前路径是否满足目标路径
public List<List<Integer>> pathSum(TreeNode root, int target) {
if (root == null) return result;
dfs(root,target);
return result;
}
/** 创建一个函数,用来递归查找路径
* 传入结点 实现将目标路径存入结果集中*/
public void dfs(TreeNode node,int target){
/** 终止条件: 穿过叶子节点 或者 获得路径*/
if (node == null) return;
/** 通过判断该路径是否满足目标路径,如果满足,就存入结果集中,并回溯*/
path.add(node.val);
if (target == 0 && node.left == null && node.right == null){
result.add(new ArrayList(path));
path.remove(path.size()-1);//回溯
return;
}
/** 问题与子问题联系: 左子树和右子树是否满足为目标路径*/
dfs(node.left,target - node.val);
dfs(node.right,target - node.val);
/** 回溯*/
path.remove(path.size()-1);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}