一、需求
-
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。
-
从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
二、回溯法
2.1 思路分析
- 本题要求将所有符合条件的路径加入到一个集合中,故定义一个dfs方法,功能是将符合条件的路径加入到集合中;
- 采用先序遍历框架,如当前节点路径和不满足要求,那么可以dfs方法可以分解为当前节点左子树的路径和是否等于目标值减当前节点值和当前节点右子树的路径和是否等于目标值减当前节点值;
- 定义path变量来记录路径,符合条件就加入集合,最后还要回溯回去,比如说现在有一棵树,有3个节点,第一层1个,第二层2个,当左子树递归结束后,此时的左子树路径和不管符不符合条件,都应该回溯到根节点,然后判断其右子树路径和是否符合条件;
2.3 代码实现
class Solution {
List<List<Integer>> res = new LinkedList<>();
LinkedList<Integer> path = new LinkedList<>();
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
if(root == null) return res;
dfs(root, targetSum);
return res;
}
public void dfs(TreeNode root, int targetSum) {
if(root == null) return;
path.add(root.val);
int tmp = targetSum - root.val;
if(root.left == null && root.right == null && tmp == 0) {
res.add(new LinkedList(path));
}
dfs(root.left, tmp);
dfs(root.right, tmp);
path.removeLast();
}
}
2.4 复杂度分析
- 时间复杂度为;
- 空间复杂度为O(N),最坏情况下,当树退化为链表,path最多存储N个元素。
三、参考地址
作者:Krahets