题目介绍
力扣113题:leetcode-cn.com/problems/pa…
分析
深度优先搜索
我们可以采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。
代码如下:
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> list = new ArrayList<>();
public List<List<Integer>> pathSum(TreeNode root, int sum) {
dfs(root, 0, sum);
return res;
}
public void dfs(TreeNode root, int num, int sum){
if(root == null) {
return;
}
num += root.val;
list.add(root.val);
//找到符合条件的一条路径
if(num == sum && root.left == null && root.right == null) {
res.add(new ArrayList(list));
}
dfs(root.left, num, sum);
dfs(root.right, num, sum);
//相当于回溯
list.remove(list.size() - 1);
}
}
复杂度分析
-
时间复杂度:O(N^2) :其中N是树的节点数。在最坏情况下,树的上半部分为链状,下半部分为完全二叉树,并且从根节点到每一个叶子节点的路径都符合题目要求。此时,路径的数目为 O(N),并且每一条路径的节点个数也为 O(N)因此要将这些路径全部添加进答案中,时间复杂度为 O(N^2)
-
空间复杂度:O(N),其中 NN 是树的节点数。空间复杂度主要取决于栈空间的开销,栈中的元素个数不会超过树的节点数。