-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPath Sum II.js
73 lines (59 loc) · 2.2 KB
/
Path Sum II.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum.
// Note: A leaf is a node with no children.
// Example:
// Given the below binary tree and sum = 22,
// 5
// / \
// 4 8
// / / \
// 11 13 4
// / \ / \
// 7 2 5 1
// Return:
// [
// [5,4,11,2],
// [5,8,4,5]
// ]
// Fairly tricky question. If we can guarantee the result to have only one answer, then we can employ a simular tactic like with pathsum 1
// However, to accomodate for multiple answers, we need to modify the intake since we cannot simply returning from the leaf and recurse back
var pathSum = function(root, sum) {
if (!root) return [];
let result = [];
function DFS(node, currValue, arrayList) {
if (!node) return;
// We HAVE to compute the currValue in here, since we pass 0 at the root level, I tried to do currValue + node.val at the if left and right but it is not correct
currValue += node.val
if (!node.left && !node.right) {
// this is at the leaf, we can check if currValue is now the sum, if it is, we have 1 answer
if (currValue === sum) {
result.push([...arrayList, node.val]);
}
}
// we also have to clone the array list, since simply do array push and passing in, it will remain as the same array throughout and the answer will not be correct
// at each recursive call, the array has to be new and unique to that path
if (node.left ) DFS(node.left, currValue, [...arrayList, node.val]);
if (node.right ) DFS(node.right, currValue, [...arrayList, node.val]);
}
DFS(root, 0, []);
return result;
};
// A different way, a bit less performant since this travels all the way to the null
var pathSum = function(root, sum) {
if (!root) return [];
let result = [];
function DFS(node, currValue, arrayList) {
if (node) {
// calculate currValue at each step
currValue -= node.val;
// recompute new arrayList, this has to be new at each step
arrayList = arrayList.concat(node.val);
if (currValue === 0 && !node.left && !node.right) {
result.push(arrayList);
}
DFS(node.left, currValue, arrayList);
DFS(node.right, currValue, arrayList);
}
}
DFS(root, sum, []);
return result;
};