24.二叉树中和为某一值的路径 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
思路: 1.判断树是否为null、是否只有根节点 2.用前序遍历方法,首先将访问的每个节点入队列(或栈均可);并将其数值求和在入队列之前 3.判断当前之和否满足给定值以及当前节点是否叶节点。 若当前值等于给定值,且当前节点是叶节点,则将路径保存到list 中; (注:若当前值小于给定值,且当前节点不是叶节点,则递归调用该节点的左右子树; 若当前值大于给定值,无需递归了(在默认节点值为正数的情况下)
public class Solution { //相当于一个临时操作栈,存储路径 private ArrayList<Integer> path=new ArrayList<>(); //存储所有路径 private ArrayList<ArrayList<Integer>> list=new ArrayList<>(); int valsum=0; public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) { if(root==null) return list;//如果树为空,返回空路径 boolean leaf=(root.left==null && root.right==null);//用来存储节点是否为叶子节点 //在添加到路径之前,首先计算节点值和; valsum+=root.val; //每访问到一个结点的时候,都把当前的结点添加到路径中去 path.add(root.val); //.判断当前之和否满足给定值,以及当前节点是否叶节子结点。 // 已到叶节点并且和为target,则把当前路径添加到输出列表里 //因为add添加的是引用,如果不new一个的话,最终list保存到的只是最后一个path //不重新new的话,list中所有引用都是指向同一个path if(valsum==target && leaf){ list.add(new ArrayList<Integer>(path)); } //否则继续遍历 //若当前值小于给定值,且当前节点不是叶节点,则递归调用该节点的左右子树;继续查找 FindPath(root.left,target); FindPath(root.right,target); //到这一步说明已经走到了叶子节点,如果还没有找到就要回退到父结点继续寻找 valsum-=root.val; path.remove(path.size()-1); return list; } }