给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
输入:[5,4,8,11,null,13,4,7,2,null,null,5,1],22
输出:[ [5,4,11,2], [5,8,4,5] ]
题解:利用DFS回溯法遍历二叉树,同时记录当前路径的节点值总和,当达到一个叶子节点时,判断节点值总和是否等于目标和,如果等于,则得到一个结果。
class Solution {
/**
* {@code Deque<Integer>deque}用于记录路径
* {@code List<List<Integer>>res}用于记录结果
*/
private final Deque<Integer>deque=new LinkedList<>();
private final List<List<Integer>>res=new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
DFS(root,0,sum);
return res;
}
/**
* @param node 当前搜索节点
* @param sum 当前路径的节点值总和
* @param targetSum 目标和
*/
private void DFS(TreeNode node,int sum,int targetSum){
if(node==null)
return;
deque.offerLast(node.val);
sum+=node.val;
if(node.left==null&&node.right==null){
if(sum==targetSum)
res.add(new ArrayList<>(deque));
deque.pollLast();
return;
}
DFS(node.left,sum,targetSum);
DFS(node.right,sum,targetSum);
deque.pollLast();
}
}