113. Path Sum II
Leetcode Tree Depth-first SearchGiven a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
Note: A leaf is a node with no children.
Example:
Given the below binary tree and sum = 22
,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
Return:
[
[5,4,11,2],
[5,8,4,5]
]
分析¶
这道题目是112. Path Sum的加强版。Q112中只需要给出是否存在这样一条路径:路径开始于根节点,终止于叶子节点,并且路径的和为给定值。现在,更进一步,需要给出具体的路径。一种很自然的想法是,改进Q112算法,传递一个List参数,依次保存访问过的节点为路径,最后保存符合要求的路径。
使用Backtracking的思想(DFS),删除访问过的元素:
private List<List<Integer>> paths = new ArrayList<List<Integer>>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
findPathSum(root, sum, new ArrayList<>());
return paths;
}
private void findPathSum(TreeNode root, int sum, ArrayList<Integer> list){
if (root == null) return;
list.add(root.val);
if (root.left == null && root.right == null && sum == root.val)
paths.add(new ArrayList<>(list));
int newSum = sum - root.val;
findPathSum(root.right, newSum, list);
findPathSum(root.left, newSum, list);
list.remove(list.size() - 1);
}
为什么只删除一次呢?因为到了叶子结点的时候,它的左子节点和右子节点都是null,所以相当于删除了该叶子节点。