LeetCode OJ 113. Path Sum II

时间:2021-10-13 15:12:07

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.

For 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]
]

相比较判断一个树中是否有sum为某一值的从根节点到叶子节点的路径,这个题目要求把所有这样的路径找出来。如果我们要用递归的方法,如何来存储这样的路径呢?

一个节点如果有左右两个子节点,那么就会产生两条不同的路径,在递归的过程中,我们要不断地new一个list来存储新出现的分支,并要把从根节点到达当前节点的路径拷贝到新建的list中。当到达叶子节点后,如果是一条匹配路径,则把该路径加入到存储路径的list中,否则的话舍弃该路径。代码如下:

 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution { public List<List<Integer>> list = new ArrayList();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
if(root == null) return list; List<Integer> llist = new ArrayList();
path(root, sum, llist);
return list;
} public void path(TreeNode root, int sum, List<Integer> llist){
if(root.left==null && root.right==null){
if(root.val==sum){
llist.add(sum);
list.add(llist);
}
return;
}
if(root.right!=null){
List<Integer> rlist = new ArrayList();
for(Integer i : llist){
rlist.add(i);
}
rlist.add(root.val);
path(root.right, sum - root.val, rlist);
}
if(root.left!=null){
llist.add(root.val);
path(root.left, sum - root.val, llist);
}
}
}