输出集合为空的原因,二叉树中和为某一值的路径集合
ArrayList输出为空[]的原因
新手常常忽略的问题:
对于ArrayList这种引用类型的集合,每增加一个ArrayList都要new一个ArrayList()的,因为没有new关键字,java虚拟机是不会给你的ArrayList开辟新的存储空间的,那么输出就当然是空数组啊!
二叉树中和为某一值的路径集合
题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。----牛客网.剑指offer
问题分析
题目要求返回一个ArrayList<ArrayList<Integer>>。每一个路径保存为ArrayList<Integer>,取经过的节点的值组成的集合;所有路径组成一个ArrayList<ArrayList<Integer>>集合。(<>这个是泛型里面的符号,限定该集合组成的元素类型)
可以用栈的思想,首先让根节点的值入栈,然后判断它是否为叶子节点,如果是的话,则计算该路径的和是否为指定的值,是则将当前路径加入到总路径中,这里注意要删除当前路径最后一个值;若该节点不是叶子节点,则分别递归它的左右子树;若根节点为空,则直接返回总路径集合。
难点
每次递归到叶子节点,也就是当前路径到头了的时候,要把当前集合最后一个元素删除;把它想象成一个栈,就是弹出栈顶那个元素。比如:
代码如下
public class Solution {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> path = new ArrayList<Integer>();
public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
if(root==null)
return list;
path.add(root.val);
if(root.left==null&&root.right==null&&target==0)
{
int sum=0;
for(int i=0;i<path.size();i++){
sum+=path.get(i);
}
if(sum==target)
list.add(new ArrayList<Integer>(path));//这里我一开始没有new,直接传入path,结果输出为空
}
FindPath(root.left,target);
FindPath(root.right,target);
path.remove(path.size()-1);
return list;
}
}
注意:将path加进总路径集合中时,要以path为参数新建一个集合new ArrayList(path),否则输出的就为空了。