问题描述:
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
示例:
给定如下二叉树,以及目标和 sum = 22,
5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1
返回:
[
[5,4,11,2],
[5,8,4,5]
]
解题思路:
这题可以用深搜回溯的方法进行求解,每一个节点都有左和右两种走法,需要注意判断节点是否为null。
由于这题没有说明给出的数都是整数,所以不能通过目标值sum和当前路径的和s进行比较然后剪枝。
代码实现:
private static List<List<Integer>> res = new LinkedList<List<Integer>>();
private static LinkedList<Integer> t = new LinkedList<Integer>();
public static List<List<Integer>> pathSum(TreeNode root, int sum) {
if(root==null) return res;
t.add(root.val);
dfs(root, sum, root.val);
return res;
}
private static void dfs(TreeNode root, int sum, int s) {
// if(s>sum) return ; //剪枝 -2 > -5 会导致负数比较时出现错误
if(s==sum && root.left==null && root.right==null) { //递归出口
res.add(new LinkedList<Integer>(t));
}
//向左走
if(root.left!=null) {
t.add(root.left.val);
dfs(root.left, sum, s+root.left.val);
t.pollLast(); //回溯 删除最后一个元素
}
//向右走
if(root.right!=null) {
t.add(root.right.val);
dfs(root.right, sum, s+root.right.val);
t.pollLast(); //回溯
}
}
提交结果:
复杂度分析:
- 时间复杂度:O(n),n为二叉树的节点数,需要遍历所有的节点。
- 空间复杂度:O(n), 在最坏的情况下,即树退化为链表时,需要使用n个节点的空间。