一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
一、题目
leetcode 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]
示例 2:
输入:root = [1,2,3], targetSum = 5
输出:[]
示例 3:
输入:root = [1,2], targetSum = 0
输出:[]
提示:
树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000
二、题解
二叉树中每个从根节点到其叶子节点的所有节点连接成一条路径,节点之下没有子节点的就是叶子节点,需要找出这些节点路径值之和等于目标值的所有路径。
方法一
简单的需要通过dfs广度优先搜索遍历树节点到叶子节点的每一条路径,然后需要在遍历过程中累加当前路径的节点之和,当遍历到叶子节点的时候,判断累加和是否等于目标值。具体的就需要从root树的根节点开始递归遍历其子节点,所以dfs递归函数需要一个node树参数,同时递归最后还需要判断路径节点总和与目标值是否相等,所以还需要一个pathSum记录当前路径下遍历到的节点总和。然后递归结束条件为当前node为null时return。然后就需要用pathSum累加上当前节点的值,然后记得把当前节点添加到path路径中,然后就可以判断,如果当前节点是叶子节点,并且当前路径的节点之后等于目标值targetSum,你就将当前遍历的path路径添加到result最终结果集中,否则就需要继续往下遍历其子节点,同时将targetSum递归下去累加。最后不论当前path路径是否符合条件,都需要将path路径中的当前节点移除掉,为了继续从其他子节点开始继续遍历其他的路径。
三、代码
方法一 Java代码
class Solution {
List<List<Integer>> result = new LinkedList<>();
Deque<Integer> path = new LinkedList<>();
int targetSum = 0;
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
this.targetSum = targetSum;
dfs(root, 0);
return result;
}
public void dfs(TreeNode node, int pathSum) {
if (node == null) {
return;
}
pathSum += node.val;
path.offerLast(node.val);
if (node.left == null && node.right == null && pathSum == targetSum) {
result.add(new LinkedList<>(path));
}else {
dfs(node.left, pathSum);
dfs(node.right, pathSum);
}
path.pollLast();
}
}
时间复杂度:O(N^2),需要遍历从数的根节点到叶子节点的每一条路径,每条路径有n个节点,共有n条路径。
空间复杂度:O(N),需要一个结果集数组存储符合条件的数量,一个路径链表存储路径的节点以及dfs的栈空间。