二叉树中和为某一值的路径(二)_牛客题霸_牛客网
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 void FindPathDfs(TreeNode root,int target,ArrayList<Integer> list,ArrayList<ArrayList<Integer>> result){
if(root == null){
return;
}
list.add(root.val);
target-=root.val;
if(root.left == null && root.right == null && target == 0){
result.add(new ArrayList<Integer>(list));
}
//当时这里我有疑问,后来仔细一想,假如你上面进入判断了,说明找到一条路线,那么你为啥还要去遍历这条
//路线的左右子树呢???
//如果你不写遍历左右子树话,你无法去递归,假如你没有进入判断,那么可能是因为还没到叶子结点,那么你你需要继续去递归,,如果你满足了,你本来就是叶子结点,你左右子树进去递归也会因为开头的递归条件直接返回.所以是无妨的
FindPathDfs(root.left,target,list,result);
FindPathDfs(root.right,target,list,result);
//那当你走到这里的时候,说明你左右子树都递归到最深处还没返回,说明不满足,那么我们就去把这个节点的val值从list数组中删除,这才是剪枝
list.remove(list.size()-1);
}
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
FindPathDfs(root,expectNumber,list,result);
return result;
}
}