1
1
package io .github .clormor .hackerrank .advanced .visitor ;
2
2
3
- import java .util .Arrays ;
4
3
import java .util .HashMap ;
5
4
import java .util .HashSet ;
6
5
import java .util .Map ;
7
6
import java .util .Set ;
8
7
9
8
public class TreeParser {
10
9
11
- Map < Integer , Integer > values ;
12
- Map < Integer , Color > colours ;
10
+ int [] values ;
11
+ Color [] colours ;
13
12
Map <Integer , Set <Integer >> allEdges ;
14
13
15
14
public Tree solve (int n , String [] args ) {
@@ -20,53 +19,41 @@ public Tree solve(int n, String[] args) {
20
19
// parse the edge lines into numbers we can search for
21
20
mapAllEdges (args );
22
21
23
- // begin depth-first search - find children of the root
24
- Set <Integer > edges = findNodeEdges (0 );
25
-
26
22
// handle 1-node tree as special case
27
- if (edges . size () == 0 ) {
28
- return new TreeLeaf (values . get ( 0 ) , colours . get ( 0 ) , 0 );
23
+ if (n == 1 ) {
24
+ return new TreeLeaf (values [ 0 ] , colours [ 0 ] , 0 );
29
25
}
30
26
31
27
// recursively search the tree to create nodes from the root
32
- TreeNode root = new TreeNode (values .get (0 ), colours .get (0 ), 0 );
33
- for (int child : edges ) {
34
- processNode (child , 1 , root );
35
- }
28
+ TreeNode root = new TreeNode (values [0 ], colours [0 ], 0 );
29
+ processNode (root , 1 );
36
30
37
31
return root ;
38
32
}
39
33
40
- private void processNode (Integer node , int depth , TreeNode parent ) {
41
- Set <Integer > edges = findNodeEdges (node );
42
- if (edges .size () == 0 ) {
43
- parent .addChild (new TreeLeaf (values .get (node ), colours .get (node ), depth ));
44
- } else {
45
- TreeNode currentNode = new TreeNode (values .get (node ), colours .get (node ), depth );
46
- parent .addChild (currentNode );
47
- for (int child : edges ) {
48
- processNode (child , depth + 1 , currentNode );
34
+ private void processNode (TreeNode parent , int parentId ) {
35
+ for (Integer childId : allEdges .get (parentId )) {
36
+ allEdges .get (childId ).remove (parentId );
37
+ Tree child ;
38
+ Set <Integer > grandChildren = allEdges .get (childId );
39
+ if (grandChildren != null && grandChildren .size () == 0 ) {
40
+ child = new TreeLeaf (values [childId - 1 ], colours [childId - 1 ], parent .getDepth () + 1 );
41
+ } else {
42
+ child = new TreeNode (values [childId - 1 ], colours [childId - 1 ], parent .getDepth () + 1 );
43
+ }
44
+ parent .addChild (child );
45
+ if (child instanceof TreeNode ) {
46
+ processNode ((TreeNode ) child , childId );
49
47
}
50
48
}
51
49
}
52
50
53
- private Set <Integer > findNodeEdges (int node ) {
54
- Set <Integer > result = allEdges .get (node );
55
- if (result == null ) {
56
- return new HashSet <>();
57
- }
58
- for (Integer i : result ) {
59
- allEdges .get (i ).remove (node );
60
- }
61
- return result ;
62
- }
63
-
64
51
private void mapAllEdges (String [] edgeLines ) {
65
52
allEdges = new HashMap <>();
66
53
for (int i = 2 ; i < edgeLines .length ; i ++) {
67
54
String [] edge = edgeLines [i ].split (" " );
68
- int a = Integer .parseInt (edge [0 ]) - 1 ;
69
- int b = Integer .parseInt (edge [1 ]) - 1 ;
55
+ int a = Integer .parseInt (edge [0 ]);
56
+ int b = Integer .parseInt (edge [1 ]);
70
57
71
58
Set <Integer > as = allEdges .get (a );
72
59
if (as == null ) {
@@ -85,18 +72,18 @@ private void mapAllEdges(String[] edgeLines) {
85
72
}
86
73
87
74
private void mapValues (int n , String valuesLine ) {
88
- values = new HashMap <>( n ) ;
75
+ values = new int [ n ] ;
89
76
String [] valuesString = valuesLine .split (" " );
90
77
for (int i = 0 ; i < n ; i ++) {
91
- values . put ( i , Integer .parseInt (valuesString [i ]) );
78
+ values [ i ] = Integer .parseInt (valuesString [i ]);
92
79
}
93
80
}
94
81
95
82
private void mapColours (int n , String coloursLine ) {
96
- colours = new HashMap <>( n ) ;
83
+ colours = new Color [ n ] ;
97
84
String [] coloursString = coloursLine .split (" " );
98
85
for (int i = 0 ; i < n ; i ++) {
99
- colours . put ( i , (coloursString [i ].equals ("0" )) ? Color .RED : Color .GREEN ) ;
86
+ colours [ i ] = (coloursString [i ].equals ("0" )) ? Color .RED : Color .GREEN ;
100
87
}
101
88
}
102
89
}
0 commit comments