Leetcode113. 路径总和 II
题目描述
/**
* 给你二叉树的根节点 root 和一个整数目标和 targetSum ,
* 找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
*
* 叶子节点 是指没有子节点的节点。
*
*/
思路分析
- 计算从根节点到叶子节点的路径总和是否等于目标值,可以使用深度优先的思路
- 定义一个全局的集合和一个全局的双向队列,使用集合保存满足条件的路径,使用双向队列判断路径和是否等于目标值
- 将当前层的节点值保存到队列中,并重置目标值
- 详解见下
源码及分析
/**
* @param root 根节点
* @param targetSum 目标值
* @return
*/
//保存结果集
List<List<Integer>> res = new ArrayList<>();
//定义双向队列保存每条路径上的结果集
Deque<Integer> path = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
dfs(root, targetSum);
return res;
}
//深度优先算法
public void dfs(TreeNode root, int targetSum) {
//根节点校验
if (root == null) {
return;
}
//先将第一层节点值保存到队列
path.offerLast(root.val);
//在进入下一层时使用目标值减去上一层的节点值得到新的目标值
targetSum -= root.val;
//如果是子节点并且当前子节点路径上节点值之和等于目标值
if (root.left == null && root.right == null && targetSum == 0) {
res.add(new ArrayList<>(path));
}
//递归遍历左子树和右子树
dfs(root.left, targetSum);
dfs(root.right, targetSum);
path.pollLast();
}