【解题思路】
使用深搜的方法,查找到叶节点(左子树、右子树都为空),判断此时路径上各个节点的和是否等于target,如果等于,将路径(list)加入到ans中。
刚开始的代码中,直接使用ans.add(list),运行结果是错误的。单步调试发现在list递归回上一层以后,删掉list末尾的节点,ans中添加的list也随之删掉末尾的节点。改为newlist = list; ans.add(list);依然存在这个问题。这是因为list、newlist,以及ans中的list均指向同一片内存。为了解决这个问题,在添加的时候,每次都要new一个新的list。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* c
* }
*/
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int target) {
if(root == null) return new ArrayList();
List ans = new ArrayList();
List<Integer> list = new ArrayList<Integer>();
list.add(root.val);
search(root, target, list, ans);
return ans;
}
public void search(TreeNode node, int target, List<Integer> list, List ans)
{
if(node.left == null && node.right == null)
{
int cnt = 0;
for(Integer num : list)
{
cnt += num;
}
if(cnt == target)
{
List newList = new ArrayList();
for(Integer k : list)
{
newList.add(k);
}
ans.add(newList);
}
return;
}
else
{
List<TreeNode> subNodes = new ArrayList<TreeNode>();
subNodes.add(node.left);
subNodes.add(node.right);
for(TreeNode subNode : subNodes)
{
if(subNode != null)
{
list.add(subNode.val);
search(subNode, target, list, ans);
list.remove(list.size()-1);
}
}
}
}
}