输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径
import java.util.ArrayList;
//import java.util.Stack;
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
//需要注意的是递归函数的参数传递,如果是在FindPathCore函数中定义curResult和curSum时,不传入该函数的话,它的下一级递归函数是无法看到这两个值的
public class Solution {
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//定义result用于存储找到的所有符合条件的路径
ArrayList<ArrayList<Integer>> result=new ArrayList<>();
ArrayList<Integer> curResult=new ArrayList<>();
if(root==null){
return result;
}
int curSum=0;
FindPathCore(root,target,curResult,result,curSum);
return result;
}
private void FindPathCore(TreeNode root,int target,ArrayList<Integer> curResult,ArrayList<ArrayList<Integer>> result,int curSum){
if(root==null){
return;
}
boolean isLeaf=(root.left==null&&root.right==null);
curSum+=root.val;
//如果让前节点是叶子节点
if(isLeaf){
if(curSum==target){
curResult.add(root.val);
result.add(new ArrayList<Integer>(curResult));
//路径中取出该叶子节点
curResult.remove(curResult.size()-1);
}
//返回上层节点,并从当前路径和中减去该叶子节点
curSum-=root.val;
return;
}
curResult.add(root.val);
FindPathCore(root.left,target,curResult,result,curSum);
FindPathCore(root.right,target,curResult,result,curSum);
curResult.remove(curResult.size()-1);
}
}