题目描述
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树,以及目标和 sum = 22,
返回:
[
[5,4,11,2],
[5,8,4,5]
]
思路
DFS(前序遍历),递归
- 用一个path来存放路径,每次将当前节点值添加到路径中
- 分别递归的遍历左节点和右节点,递归完右节点(递归终止)后将最后一个节点值从path中移除
- 如果到达根节点,并且加和总和等于sum,则将path添加到res结果集中
时间复杂度:O(n),空间复杂度O(logn)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**
* 思路:DFS(前序遍历),递归
* 用一个path来存放路径,每次将当前节点值添加到路径中
* 分别递归的遍历左节点和右节点,递归完右节点(递归终止)后将最后一个节点值从path中移除
* 如果到达根节点,并且加和总和等于sum,则将path添加到res结果集中
* 时间复杂度:O(n),空间复杂度O(logn)
*/
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> res = new ArrayList<>();
if(root == null)
return res;
dfs(root, sum, res, new ArrayList<>());
return res;
}
public void dfs(TreeNode root, int sum, List<List<Integer>> res, List<Integer> path){
if(root == null)
return;
path.add(root.val);
int rest = sum - root.val; //求剩余值
if(root.left == null && root.right == null && rest == 0) //判断到达根节点,并且加和为sum
res.add(new ArrayList(path));
dfs(root.left, rest, res, path);
dfs(root.right, rest, res, path);
path.remove(path.size()-1);
}
}