题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
题目很简单,但是需要考虑怎么在前序遍历完一遍后将用于计算的备用值和数组清零?
那么在遍历完该节点后,最后回退一下就可以了:
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();//存储所有满足条件的路径
ArrayList<Integer> arr = new ArrayList<Integer>();//存储当前路径
int num = 0;//存储当前路径的值
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return result;
num += root.val;
arr.add(root.val);
boolean isLeaf = root.left==null && root.right==null; //判断是否当前节点是叶子节点
if(isLeaf==true && target == num){
ArrayList<Integer> path = new ArrayList<Integer>();
for(int i=0;i<arr.size();i++){//这四行切记不要直接将arr数组add到result中,
path.add(arr.get(i));//因为arr数组一直在改变
}//直到整个前序遍历结束arr也就变成了空数组
result.add(path);//所以你add到result中的也会是空数组
}
if(root.left!=null && num<target){
FindPath(root.left,target);
}
if(root.right!=null && num<target){
FindPath(root.right,target);
}
//移除当前节点
num -= root.val;
arr.remove(arr.size()-1);
return result;
}