我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/path-sum-ii/description/
题目描述:
知识点:递归、树的深度优先遍历
思路一:递归
递归终止条件:
(1)如果root为null,直接返回listList。
(2)如果root的值为sum且root的左右子树均为null,只有一条路径,且路径上只有根节点一个节点。
递归过程:
分别求左右子树上和为sum - root.val的路径,将根节点的值添加在这些路径节点的第一个节点即可。
时间复杂度和空间复杂度均是O(h),其中h为树的高度。
JAVA代码:
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> listList = new ArrayList<>();
if(root == null) {
return listList;
}
List<Integer> list = new ArrayList<>();
list.add(root.val);
if(root.val == sum && root.left == null && root.right == null) {
listList.add(list);
return listList;
}
List<List<Integer>> leftListList = pathSum(root.left, sum - root.val);
List<List<Integer>> rightListList = pathSum(root.right, sum - root.val);
for (List<Integer> tempList : leftListList) {
tempList.addAll(0, list);
listList.add(tempList);
}
for (List<Integer> tempList : rightListList) {
tempList.addAll(0, list);
listList.add(tempList);
}
return listList;
}
}
LeetCode解题报告:
思路二:树的深度优先遍历
本质上和思路一是一致的。
时间复杂度和空间复杂度均是O(h),其中h为树的高度。
JAVA代码:
public class Solution {
List<List<Integer>> listList;
List<Integer> list;
public List<List<Integer>> pathSum(TreeNode root, int sum) {
listList = new ArrayList<>();
if(null == root){
return listList;
}
list = new ArrayList<>();
dfs(root, sum);
return listList;
}
private void dfs(TreeNode root, int sum) {
list.add(root.val);
if(null == root.left && null == root.right){
sum -= root.val;
if(sum == 0){
listList.add(new ArrayList<>(list));
}
list.remove(list.size() - 1);
return;
}
if(null != root.left){
dfs(root.left, sum - root.val);
}
if(null != root.right){
dfs(root.right, sum - root.val);
}
list.remove(list.size() - 1);
}
}
LeetCode解题报告: