解题思路:回溯
如给定二叉树,以及目标和 target = 22
5/ \4 8/ / \11 13 4/ \ / \7 2 5 1
题目要求我们返回所有路径和为 target 的序列:
[ [5,4,11,2] , [5,8,4,5] ]
本题是一道典型的二叉树搜索问题,使用回溯算法解决
算法流程:
递归函数:pathSum(TreeNode root,int target,int sum,List> res,List
返回值:void
参数解释:
- TreeNode root :遍历到的当前节点
- int target :题目给定的目标和
- int sum :遍历到当前节点的路径和
- List
- > res
- List
list :添加到 res 结果集中符合条件的列表
递归终止条件:当节点为空,直接返回
递推过程:
- 路径和的更新:sum = sum + root.val
- list 添加至 res 条件:
- root 为叶节点(左右节点均为 null)
- sum = target
- 遍历过程:先序遍历,先从根开始,递归左/右 子节点
- 路径恢复:向上回溯前,需要移除当前的节点,即执行 list.removeLast()
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/class Solution {public List<List<Integer>> pathSum(TreeNode root, int target) {List<List<Integer>> res = new LinkedList<>();List<Integer> list = new LinkedList<>();pathSum(root,target,0,res,list);return res;}private static void pathSum(TreeNode root,int target,int sum,List<List<Integer>> res,List<Integer> list){if(root == null){return;}list.add(root.val);sum += root.val;if(root.left == null && root.right == null && sum == target){res.add(new LinkedList<>(list));}else {pathSum(root.left,target,sum,res,list);pathSum(root.right,target,sum,res,list);}list.remove(list.size() - 1);}}
复杂度分析
- 时间复杂度:O(N)
先序遍历需要遍历二叉树的所有节点
- 空间复杂度:O(N)
最差的情况下,二叉树退化为链表,递归深度为 N,使用额外空间复杂度为 : O(N)
