剑指offer82:
public boolean hasPathSum (TreeNode root, int sum) {
if(root==null) return false;
sum-=root.val;
if(sum==0&&root.left==null&&root.right==null) return true;
return hasPathSum(root.left,sum)||hasPathSum(root.right,sum);
}
剑指offer34:
List<List<Integer>> res=new LinkedList<>();
LinkedList<Integer> temp=new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int sum){
Solve(root,sum);
return res;
}
public void Solve(TreeNode root,int sum){
if(root==null) return;
sum-=root.val;
temp.add(root.val);
if(sum==0&&root.left==null&&root.right==null){
res.add(new LinkedList<>(temp));//复制一个temp,不然后续temp有改变,res里的值也会变
}
Solve(root.left,sum);
Solve(root.right,sum);
temp.removeLast();//剪枝
}
回溯的原因:需要回溯到还未包含当前结点的上一轮路径中,选择别的结点再进行递归。
剑指offer84:
int count=0;
public int FindPath(TreeNode root, int sum){
if(root==null) return count;
Solve(root,sum);
FindPath(root.left,sum);
FindPath(root.right,sum);
return count;
}
public void Solve(TreeNode root,int sum){
if(root==null) return;
sum-=root.val;
if(sum==0){
count++;
}
Solve(root.left,sum);
Solve(root.right,sum);
}