113. 路径总和 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
思路
整体思路和112. 路径总和题一致,但是要保存遍历过程的路径。注意二叉树递归遍历过程会有回溯,要把回溯值移除。符合条件时要新声明个list来接收,不然后续遍历还会对其进行修改。
解法
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> resList = new ArrayList<>();
if (root == null) {
return resList;
}
List<Integer> path = new ArrayList<>();
traversal(root, targetSum, path, resList);
return resList;
}
public void traversal(TreeNode node, int remindingSum, List<Integer> path, List<List<Integer>> resList) {
//前序遍历,添加当前节点到路径
path.add(node.val);
remindingSum -= node.val;
if (node.left == null && node.right == null) {
if (remindingSum == 0) {
//一定要新声明个list接收,不然后续遍历会把原list中的数据移除
resList.add(new ArrayList<>(path));
}
}
if (node.left != null) {
traversal(node.left, remindingSum, path, resList);
//回溯时移除数据
path.remove(path.size() - 1);
}
if (node.right != null) {
traversal(node.right, remindingSum, path, resList);
//回溯时移除数据
path.remove(path.size() - 1);
}
}
}