二叉树中和为某一值得路径
剑指offer 第25题
题目描述:
思路:
该题也是一个典型的回溯算法的题.但是比较特殊的是有两个递归.
所以两个递归的话就要删除两次,减枝两次.但是注意只需要加一次,因为删除的是后面递归的.加的是当前节点的.
具体代码:
private ArrayList<ArrayList<Integer>> res=new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root, int target) {
if(root==null) return res;
dfs(root,target,new ArrayList<Integer>());
return res;
}
public void dfs(TreeNode root, int target, List<Integer> list){
if(root.left==null&&root.right==null){
/因为对递归做了限制,所以这里要判断一下,符合情况加入.如果不做限制的话会比较麻烦.
//会有重复的问题,一个节点左右都为空,那左右都符合条件的话,就重复了.
list.add(root.val);
if(root.val==target)
res.add(new ArrayList<Integer>(list));
return;
}
if(target<0) return;
list.add(root.val);
if(root.left!=null){
dfs(root.left,target-root.val,list);
list.remove(list.size()-1);
}
if(root.right!=null){
dfs(root.right,target-root.val,list);
list.remove(list.size()-1);
}
}