问题:
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
自己代码和思考(有点复杂):
public class Solution{
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
//首先初始化两个数组,第二个数组用来递归辅助用
ArrayList<ArrayList<Integer>> listSum=new ArrayList<>();
ArrayList<Integer>list=new ArrayList<>();
//判断是否为空
if(root==null||target==0)
return listSum ;
//判断只有一个元素的时候
if(root.right==null&&root.left==null) {
list.add(root.val);
listSum.add(list);
return listSum;
}
return FindPath(root, target,list, 0, listSum);
}
//进行递归的函数
private ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target,ArrayList<Integer> list,int sum,ArrayList<ArrayList<Integer>> listSum) {
//当路径数字和为给定数字时
if((sum+root.val)==target) {
//先将数字添加进数组,避免后面的删除出现数组越界
list.add(root.val);
//判断是否为叶子节点
if(root.right==null&&root.left==null) {
//用一个数组复制原来的数组,将复制后的数组放入容器,原来数组继续进行递归
ArrayList<Integer> list1=new ArrayList<>(list);
listSum.add(list1);
}
//返回递归的上一层
return null;
}
//当路径数字和小于定数字时
else if((sum+root.val)<target) {
//将当前元素添加进数组
list.add(root.val);
if(root.left!=null) {
FindPath(root.left,target,list,sum+root.val,listSum);
// 当左边子树递归完后需要进行辅助数组元素的移除,移除更深一层递归添加进去的数字,避免路径错误
list.remove(list.size()-1);
}
if(root.right!=null) {
FindPath(root.right,target,list,sum+root.val,listSum);
list.remove(list.size()-1);
}
}else {
return null;
}
return listSum;
}
}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
下面是大神精简代码:
public class Solution {
private ArrayList<ArrayList<Integer>> listAll = new ArrayList<ArrayList<Integer>>();
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root == null) return listAll;
list.add(root.val);
target -= root.val;
if(target == 0 && root.left == null && root.right == null)
listAll.add(new ArrayList<Integer>(list));
FindPath(root.left, target);
FindPath(root.right, target);
list.remove(list.size()-1);
return listAll;
}
}