输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
从根节点开始,原来的node.val是int类型的值,现在将其变为从根节点到其的路径(list类型),改变完成之后将该list求和,然后与expectNumber比较,如果相等,判断一下当前节点是否是叶子节点(通过判断其左右子树是否都为None),否则返回False,如果小于expectNumber,则继续往后面遍历,依次类推。
采用深度遍历的思想和递归的思想。首先将根结点的值减掉。然后判断是否满足了路径条件,如果不满足就需要对左子树和右子树分别递归。 需要注意的是,在每次返回上一层的时候需要通过list.remove()方法返回上一层的状态。
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 {
//因为使用递归,要把实例化放到方法外面,作为成员
ArrayList<ArrayList<Integer>> resultList = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//因为数组长度大的放前面,使用深度优先的思想
if(root == null){
return resultList;
}
list.add(root.val);
target -= root.val;
if(target==0 && root.left==null && root.right==null){
resultList.add(new ArrayList<Integer>(list));
//因为add是添加的引用,如果不new一个出来,在后面对list的操作中会影响到resultList的内容
}else{
FindPath(root.left, target);
FindPath(root.right, target);
}
list.remove(list.size()-1);
return resultList;
}
}