1
1
package io .github .clormor .hackerrank .advanced .visitor ;
2
2
3
- import java .util .ArrayList ;
4
3
import java .util .Arrays ;
5
4
import java .util .HashMap ;
6
5
import java .util .HashSet ;
7
- import java .util .List ;
8
6
import java .util .Map ;
9
7
import java .util .Set ;
10
8
@@ -20,10 +18,10 @@ public Tree solve(int n, String[] args) {
20
18
mapColours (n , args [1 ]);
21
19
22
20
// parse the edge lines into numbers we can search for
23
- mapAllEdges (Arrays . copyOfRange ( args , 2 , n + 1 ) );
21
+ mapAllEdges (args );
24
22
25
23
// begin depth-first search - find children of the root
26
- List <Integer > edges = findNodeEdges (0 );
24
+ Set <Integer > edges = findNodeEdges (0 );
27
25
28
26
// handle 1-node tree as special case
29
27
if (edges .size () == 0 ) {
@@ -40,7 +38,7 @@ public Tree solve(int n, String[] args) {
40
38
}
41
39
42
40
private void processNode (Integer node , int depth , TreeNode parent ) {
43
- List <Integer > edges = findNodeEdges (node );
41
+ Set <Integer > edges = findNodeEdges (node );
44
42
if (edges .size () == 0 ) {
45
43
parent .addChild (new TreeLeaf (values .get (node ), colours .get (node ), depth ));
46
44
} else {
@@ -52,31 +50,37 @@ private void processNode(Integer node, int depth, TreeNode parent) {
52
50
}
53
51
}
54
52
55
- private List <Integer > findNodeEdges (int node ) {
56
- List <Integer > result = new ArrayList <>();
57
- List <Integer > keysToRemove = new ArrayList <>();
58
- for (Integer key : allEdges .keySet ()) {
59
- Set <Integer > edge = allEdges .get (key );
60
- if (edge .contains (node )) {
61
- edge .remove (node );
62
- result .add ((Integer ) edge .toArray ()[0 ]);
63
- keysToRemove .add (key );
64
- }
53
+ private Set <Integer > findNodeEdges (int node ) {
54
+ Set <Integer > result = allEdges .get (node );
55
+ if (result == null ) {
56
+ return new HashSet <>();
65
57
}
66
- for (Integer key : keysToRemove ) {
67
- allEdges .remove (key );
58
+ for (Integer i : result ) {
59
+ allEdges .get ( i ). remove (node );
68
60
}
69
61
return result ;
70
62
}
71
63
72
64
private void mapAllEdges (String [] edgeLines ) {
73
65
allEdges = new HashMap <>();
74
- for (int i = 0 ; i < edgeLines .length ; i ++) {
75
- Set <Integer > nodes = new HashSet <>();
66
+ for (int i = 2 ; i < edgeLines .length ; i ++) {
76
67
String [] edge = edgeLines [i ].split (" " );
77
- nodes .add (Integer .parseInt (edge [0 ]) - 1 );
78
- nodes .add (Integer .parseInt (edge [1 ]) - 1 );
79
- allEdges .put (i , nodes );
68
+ int a = Integer .parseInt (edge [0 ]) - 1 ;
69
+ int b = Integer .parseInt (edge [1 ]) - 1 ;
70
+
71
+ Set <Integer > as = allEdges .get (a );
72
+ if (as == null ) {
73
+ as = new HashSet <>();
74
+ allEdges .put (a , as );
75
+ }
76
+ as .add (b );
77
+
78
+ Set <Integer > bs = allEdges .get (b );
79
+ if (bs == null ) {
80
+ bs = new HashSet <>();
81
+ allEdges .put (b , bs );
82
+ }
83
+ bs .add (a );
80
84
}
81
85
}
82
86
0 commit comments