@@ -24,24 +24,13 @@ public static RangeTreeNode<Integer[]> buildXTree(List<Integer[]> inputs, int st
24
24
25
25
if (start > end ) {
26
26
return null ;
27
- } else if (end - start + 1 > 3 ) {
28
- RangeTreeNode <Integer []> node = new RangeTreeNode <>(inputs .get (mid ), buildXTree (inputs , start , mid ),
29
- buildXTree (inputs , mid + 1 , end ));
30
- node .setYTree (buildYTree (inputs , start , end ));
31
- return node ;
32
- } else if (end - start + 1 == 3 ) {
33
- RangeTreeNode <Integer []> node = new RangeTreeNode <>(inputs .get (mid ), buildXTree (inputs , start , mid ),
34
- buildXTree (inputs , end , end ));
35
- node .setYTree (buildYTree (inputs , start , end ));
36
- return node ;
37
- } else if (end - start + 1 == 2 ) {
38
- RangeTreeNode <Integer []> node = new RangeTreeNode <>(inputs .get (mid ),
39
- buildXTree (inputs , start , start ),
40
- buildXTree (inputs , end , end ));
27
+ } else if (start == end ) {
28
+ RangeTreeNode <Integer []> node = new RangeTreeNode <>(inputs .get (mid ));
41
29
node .setYTree (buildYTree (inputs , start , end ));
42
30
return node ;
43
31
} else {
44
- RangeTreeNode <Integer []> node = new RangeTreeNode <>(inputs .get (mid ));
32
+ RangeTreeNode <Integer []> node = new RangeTreeNode <>(inputs .get (mid ), buildXTree (inputs , start , mid ),
33
+ buildXTree (inputs , mid + 1 , end ));
45
34
node .setYTree (buildYTree (inputs , start , end ));
46
35
return node ;
47
36
}
@@ -58,7 +47,6 @@ public static RangeTreeNode<Integer[]> buildXTree(List<Integer[]> inputs, int st
58
47
*/
59
48
private static RangeTreeNode <Integer []> buildYTree (List <Integer []> inputs , int start , int end ) {
60
49
61
- int mid = (end + start ) / 2 ;
62
50
List <Integer []> ySortedSublist = inputs .subList (start , end + 1 );
63
51
ySortedSublist .sort (Comparator .comparingInt (a -> a [1 ])); //sort by y-coordinate
64
52
@@ -80,17 +68,11 @@ private static RangeTreeNode<Integer[]> buildYTreeHelper(List<Integer[]> inputs,
80
68
81
69
if (start > end ) {
82
70
return null ;
83
- } else if (end - start + 1 > 3 ) {
71
+ } else if (start == end ) {
72
+ return new RangeTreeNode <>(inputs .get (start ));
73
+ } else {
84
74
return new RangeTreeNode <>(inputs .get (mid ), buildYTree (inputs , start , mid ),
85
75
buildYTree (inputs , mid + 1 , end ));
86
- } else if (end - start + 1 == 3 ) {
87
- return new RangeTreeNode <>(inputs .get (mid ), buildYTree (inputs , start , mid ),
88
- buildYTree (inputs , end , end ));
89
- } else if (end - start + 1 == 2 ) {
90
- return new RangeTreeNode <>(inputs .get (mid ), buildYTree (inputs , start , start ),
91
- buildYTree (inputs , end , end ));
92
- } else {
93
- return new RangeTreeNode <>(inputs .get (mid ));
94
76
}
95
77
}
96
78
@@ -133,7 +115,7 @@ public static RangeTreeNode<Integer[]> findXSplit(RangeTreeNode<Integer[]> root,
133
115
public static void XLeftTraversal (RangeTreeNode <Integer []> v , int xLow , int xHigh , int yLow , int yHigh ,
134
116
ArrayList <Integer []> result ) {
135
117
if (v != null ) {
136
- if (v . getLeft () == null && v . getRight () == null && v .getVal ()[0 ] >= xLow && v .getVal ()[0 ] <= xHigh ) { //leaf
118
+ if (isLeaf ( v ) && v .getVal ()[0 ] >= xLow && v .getVal ()[0 ] <= xHigh ) { //leaf
137
119
YSearch (v , yLow , yHigh , result );
138
120
} else {
139
121
if (xLow <= v .getVal ()[0 ]) {
@@ -158,7 +140,7 @@ public static void XLeftTraversal(RangeTreeNode<Integer[]> v, int xLow, int xHig
158
140
public static void XRightTraversal (RangeTreeNode <Integer []> v , int xLow , int xHigh , int yLow , int yHigh ,
159
141
ArrayList <Integer []> result ) {
160
142
if (v != null ) {
161
- if (v . getLeft () == null && v . getRight () == null && v .getVal ()[0 ] >= xLow && v .getVal ()[0 ] <= xHigh ) { //leaf
143
+ if (isLeaf ( v ) && v .getVal ()[0 ] >= xLow && v .getVal ()[0 ] <= xHigh ) { //leaf
162
144
YSearch (v , yLow , yHigh , result );
163
145
} else {
164
146
if (xHigh >= v .getVal ()[0 ]) {
@@ -186,7 +168,7 @@ public static RangeTreeNode<Integer[]> findYSplit(RangeTreeNode<Integer[]> root,
186
168
return null ;
187
169
} else {
188
170
if (yHigh <= v .getVal ()[1 ]) {
189
- if (v . getLeft () == null && v . getRight () == null ) { // extra check since ysplit might be leaf node
171
+ if (isLeaf ( v ) ) { // extra check since ysplit might be leaf node
190
172
break ;
191
173
} else {
192
174
v = v .getLeft ();
@@ -212,7 +194,7 @@ public static void allLeafTraversal(RangeTreeNode<Integer[]> v, List<Integer[]>
212
194
if (v .getLeft () != null ) {
213
195
allLeafTraversal (v .getLeft (), result );
214
196
}
215
- if (v . getLeft () == null && v . getRight () == null ) { // leaf
197
+ if (isLeaf ( v ) ) {
216
198
result .add (v .getVal ());
217
199
}
218
200
if (v .getRight () != null ) {
@@ -228,16 +210,16 @@ public static void allLeafTraversal(RangeTreeNode<Integer[]> v, List<Integer[]>
228
210
* @param low The lower bound of the Y-coordinate range.
229
211
* @param result A list to store the results.
230
212
*/
231
- public static void leftTraversal (RangeTreeNode <Integer []> v , int low , List <Integer []> result ) {
213
+ public static void YLeftTraversal (RangeTreeNode <Integer []> v , int low , List <Integer []> result ) {
232
214
if (v != null ) {
233
- if (v . getLeft () == null && v . getRight () == null ) { // leaf
215
+ if (isLeaf ( v ) ) {
234
216
result .add (v .getVal ());
235
217
} else {
236
218
if (low <= v .getVal ()[1 ]) {
237
- leftTraversal (v .getLeft (), low , result );
219
+ YLeftTraversal (v .getLeft (), low , result );
238
220
allLeafTraversal (v .getRight (), result );
239
221
} else { // definitely a qualifying leaf has to exist
240
- leftTraversal (v .getRight (), low , result );
222
+ YLeftTraversal (v .getRight (), low , result );
241
223
}
242
224
}
243
225
}
@@ -250,16 +232,16 @@ public static void leftTraversal(RangeTreeNode<Integer[]> v, int low, List<Integ
250
232
* @param high The upper bound of the Y-coordinate range.
251
233
* @param result A list to store the results.
252
234
*/
253
- public static void rightTraversal (RangeTreeNode <Integer []> v , int high , List <Integer []> result ) {
235
+ public static void YRightTraversal (RangeTreeNode <Integer []> v , int high , List <Integer []> result ) {
254
236
if (v != null ) {
255
- if (v . getLeft () == null && v . getRight () == null && v .getVal ()[1 ] <= high ) { // leaf, need extra check
237
+ if (isLeaf ( v ) && v .getVal ()[1 ] <= high ) { // leaf, need extra check
256
238
result .add (v .getVal ());
257
239
} else {
258
240
if (high > v .getVal ()[1 ]) {
259
241
allLeafTraversal (v .getLeft (), result );
260
- rightTraversal (v .getRight (), high , result );
242
+ YRightTraversal (v .getRight (), high , result );
261
243
} else { // a qualifying leaf might or might not exist, we are just exploring
262
- rightTraversal (v .getLeft (), high , result );
244
+ YRightTraversal (v .getLeft (), high , result );
263
245
}
264
246
}
265
247
}
@@ -275,15 +257,14 @@ public static void rightTraversal(RangeTreeNode<Integer[]> v, int high, List<Int
275
257
*/
276
258
public static void YSearch (RangeTreeNode <Integer []> v , int yLow , int yHigh , ArrayList <Integer []> result ) {
277
259
if (v != null ) {
278
- System .out .println (v .getVal ()[0 ]);
279
260
RangeTreeNode <Integer []> splitNodeY = findYSplit (v .getYTree (), yLow , yHigh );
280
261
if (splitNodeY != null ) {
281
- if (splitNodeY . getLeft () == null && splitNodeY . getRight () == null
262
+ if (isLeaf ( splitNodeY )
282
263
&& splitNodeY .getVal ()[1 ] >= yLow && splitNodeY .getVal ()[1 ] <= yHigh ) { // if split node is leaf
283
264
result .add (splitNodeY .getVal ());
284
265
}
285
- leftTraversal (splitNodeY .getLeft (), yLow , result );
286
- rightTraversal (splitNodeY .getRight (), yHigh , result );
266
+ YLeftTraversal (splitNodeY .getLeft (), yLow , result );
267
+ YRightTraversal (splitNodeY .getRight (), yHigh , result );
287
268
}
288
269
}
289
270
}
@@ -302,7 +283,7 @@ public static List<Integer[]> search(RangeTreeNode<Integer[]> tree, int xLow, in
302
283
RangeTreeNode <Integer []> splitNodeX = findXSplit (tree , xLow , xHigh );
303
284
ArrayList <Integer []> result = new ArrayList <>();
304
285
if (splitNodeX != null ) {
305
- if (splitNodeX . getLeft () == null && splitNodeX . getRight () == null
286
+ if (isLeaf ( splitNodeX )
306
287
&& splitNodeX .getVal ()[0 ] >= xLow && splitNodeX .getVal ()[0 ] <= xHigh ) { // if split node is leaf
307
288
YSearch (splitNodeX , yLow , yHigh , result );
308
289
}
@@ -311,4 +292,9 @@ public static List<Integer[]> search(RangeTreeNode<Integer[]> tree, int xLow, in
311
292
}
312
293
return result ;
313
294
}
295
+
296
+ private static <T > boolean isLeaf (RangeTreeNode <T > node ) {
297
+ return node .getLeft () == null && node .getRight () == null ;
298
+ }
299
+
314
300
}
0 commit comments