剑指Offer第二十四题:二叉树中和为某一给定值的路径
典型的递归回溯
- 当当前结点是叶子结点并且路径和为target时,找到一条路径
- 当当前和currSum大于target时,这个结点往下不需要再找了
- 当当前结点不是叶子结点并且currSum小于target时,查找该结点的左右子节点
import java.util.ArrayList;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(root == null){
return res;
}
ArrayList<Integer> curr = new ArrayList<Integer> ();
curr.add(root.val);
findPathes( res,curr, target, root, root.val);
return res;
}
private void findPathes(ArrayList<ArrayList<Integer>> res,ArrayList<Integer> curr,int target,TreeNode currNode,int currSum){
if(currNode.left == null && currNode.right == null && currSum == target){
res.add(new ArrayList<Integer>(curr));
return;
}
if(currSum > target){
return;
}
if(currNode.left != null){
currSum += currNode.left.val;
curr.add(currNode.left.val);
findPathes(res,curr,target,currNode.left,currSum);
currSum -= currNode.left.val;
curr.remove(curr.size()-1);
}
if(currNode.right != null){
currSum += currNode.right.val;
curr.add(currNode.right.val);
findPathes(res,curr,target,currNode.right,currSum);
currSum -= currNode.right.val;
curr.remove(curr.size()-1);
}
}
}