1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public List<List<Integer>> pathSum(TreeNode root, int targetSum) { if (root == null) return new ArrayList<>(); List<List<Integer>> ans = new ArrayList<>(); helper(ans, new ArrayList<>(), root, 0, targetSum); return ans; }
private void helper(List<List<Integer>> ans, List<Integer> currentNodes, TreeNode node, int currSum, int target) { if (node == null) return; currSum += node.val; currentNodes.add(node.val); if (node.left == null && node.right == null && currSum == target) { ans.add(new ArrayList<>(currentNodes)); } helper(ans, currentNodes, node.left, currSum, target); helper(ans, currentNodes, node.right, currSum, target); currentNodes.remove(currentNodes.size() - 1); } }
|
就是DFS. 只是要注意, 一定是从root到leaf, 也就是最后一个node加上后等于targetSum时, 这个node必须是leaf node. 第30行的那个判断很重要.
时间复杂度: O(n^2) 遍历所有的nodes.
我们在leaf处可能会new出来一个新的arraylist并且把currentNodes里面的元素加进去. 此时就是O(N). 想象这样一个树, 是个链表, 但是每一个node还额外延伸出一个node. 这样沿着这个链表, 每到一个node就可以到达它延伸出来的这个node, 延伸出来的这个就是leaf node. 假设targetSum是0, 所有的tree node的值也是0, 那么我们每到一个leaf node就要添加一遍. 因此是O(N^2)
空间复杂度: O(n) 可能是个链表.