-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPathSumCounter.java
61 lines (48 loc) · 1.5 KB
/
PathSumCounter.java
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
package org.sean.recursive;
import org.sean.tree.TreeNode;
import java.util.HashSet;
/***
* 437. Path Sum III
*/
public class PathSumCounter {
private int counter;
private TreeNode top;
private HashSet<TreeNode> set = new HashSet<TreeNode>();
private HashSet<TreeNode> selfTravelled = new HashSet<>();
private void travelTree(TreeNode node, int sum, int currSum) {
if(node != null) {
int value = node.val;
if(value == sum) {
if(!set.contains(node)) {
set.add(node);
}
}
int newSum = currSum + value;
// middle nodes itself traversal
if(node != top) {
// extend from parent
if(newSum == sum) {
++counter;
}
// check duplicate node traversal
if(!selfTravelled.contains(node)) {
travelTree(node.left, sum, value);
travelTree(node.right, sum, value);
selfTravelled.add(node);
}
}
// normal traversal with added up result
travelTree(node.left, sum, newSum);
travelTree(node.right, sum, newSum);
}
}
public int pathSum(TreeNode root, int sum) {
counter = 0;
if(root != null) {
top = root;
set.clear();
travelTree(root, sum, 0);
}
return counter + set.size();
}
}