@@ -22,17 +22,11 @@ public static RangeTreeNode<Integer> buildTree(int[] inputs, int start, int end)
22
22
23
23
if (start > end ) {
24
24
return null ;
25
- } else if (end - start + 1 > 3 ) {
25
+ } else if (start == end ) {
26
+ return new RangeTreeNode <>(inputs [start ]);
27
+ } else {
26
28
return new RangeTreeNode <>(inputs [mid ], buildTree (inputs , start , mid ),
27
29
buildTree (inputs , mid + 1 , end ));
28
- } else if (end - start + 1 == 3 ) {
29
- return new RangeTreeNode <>(inputs [mid ], buildTree (inputs , start , mid ),
30
- buildTree (inputs , end , end ));
31
- } else if (end - start + 1 == 2 ) {
32
- return new RangeTreeNode <>(inputs [mid ], buildTree (inputs , start , start ),
33
- buildTree (inputs , end , end ));
34
- } else {
35
- return new RangeTreeNode <>(inputs [mid ]);
36
30
}
37
31
}
38
32
@@ -52,7 +46,7 @@ public static RangeTreeNode<Integer> findSplit(RangeTreeNode<Integer> root, int
52
46
return null ;
53
47
} else {
54
48
if (high <= v .getVal ()) {
55
- if (v . getLeft () == null && v . getRight () == null ) { // reached the leaf
49
+ if (isLeaf ( v ) ) {
56
50
break ;
57
51
}
58
52
v = v .getLeft ();
@@ -77,7 +71,7 @@ public static void allLeafTraversal(RangeTreeNode<Integer> v, List<Integer> resu
77
71
if (v .getLeft () != null ) {
78
72
allLeafTraversal (v .getLeft (), result );
79
73
}
80
- if (v . getLeft () == null && v . getRight () == null ) { // leaf
74
+ if (isLeaf ( v ) ) {
81
75
result .add (v .getVal ());
82
76
}
83
77
if (v .getRight () != null ) {
@@ -95,7 +89,7 @@ public static void allLeafTraversal(RangeTreeNode<Integer> v, List<Integer> resu
95
89
*/
96
90
public static void leftTraversal (RangeTreeNode <Integer > v , int low , List <Integer > result ) {
97
91
if (v != null ) {
98
- if (v . getLeft () == null && v . getRight () == null ) { // leaf
92
+ if (isLeaf ( v ) ) {
99
93
result .add (v .getVal ());
100
94
} else {
101
95
if (low <= v .getVal ()) {
@@ -117,7 +111,7 @@ public static void leftTraversal(RangeTreeNode<Integer> v, int low, List<Integer
117
111
*/
118
112
public static void rightTraversal (RangeTreeNode <Integer > v , int high , List <Integer > result ) {
119
113
if (v != null ) {
120
- if (v . getLeft () == null && v . getRight () == null && v .getVal () <= high ) { // leaf, need extra check
114
+ if (isLeaf ( v ) && v .getVal () <= high ) { // leaf, need extra check
121
115
result .add (v .getVal ());
122
116
} else {
123
117
if (high > v .getVal ()) {
@@ -142,8 +136,8 @@ public static Object[] search(RangeTreeNode<Integer> tree, int low, int high) {
142
136
RangeTreeNode <Integer > splitNode = OrthogonalRangeSearching .findSplit (tree , low , high );
143
137
ArrayList <Integer > result = new ArrayList <>();
144
138
if (splitNode != null ) {
145
- if (splitNode . getLeft () == null && splitNode .getRight () == null
146
- && splitNode . getVal () >= low && splitNode .getVal () <= high ) { // if split node is leaf
139
+ if (isLeaf ( splitNode ) && splitNode .getVal () >= low
140
+ && splitNode .getVal () <= high ) {
147
141
result .add (splitNode .getVal ());
148
142
}
149
143
leftTraversal (splitNode .getLeft (), low , result );
@@ -152,7 +146,11 @@ public static Object[] search(RangeTreeNode<Integer> tree, int low, int high) {
152
146
return result .toArray ();
153
147
}
154
148
155
- // Functions from here onwards are designed to support dynamic updates.
149
+ private static boolean isLeaf (RangeTreeNode <Integer > node ) {
150
+ return node .getLeft () == null && node .getRight () == null ;
151
+ }
152
+
153
+ // FUNCTIONS FROM HERE ONWARDS ARE DESIGNED TO SUPPORT DYNAMIC UPDATES.
156
154
157
155
/**
158
156
* Configures the height and parent nodes for the nodes in the Range Tree.
@@ -276,7 +274,7 @@ private static RangeTreeNode<Integer> rotateRight(RangeTreeNode<Integer> n) {
276
274
* @return new root after rotation
277
275
*/
278
276
private static RangeTreeNode <Integer > rotateLeft (RangeTreeNode <Integer > n ) {
279
- RangeTreeNode <Integer > newRoot = n .getRight ();
277
+ RangeTreeNode <Integer > newRoot = n .getRight (); // newRoot is the right subtree of the original root
280
278
RangeTreeNode <Integer > newRightSub = newRoot .getLeft ();
281
279
newRoot .setLeft (n );
282
280
n .setRight (newRightSub );
@@ -299,12 +297,14 @@ private static RangeTreeNode<Integer> rebalance(RangeTreeNode<Integer> n) {
299
297
updateHeight (n );
300
298
int balance = getBalance (n );
301
299
if (balance < -1 ) { // right-heavy case
302
- if (height (n .getRight ().getLeft ()) > height (n .getRight ().getRight ())) {
300
+ RangeTreeNode <Integer > rightChild = n .getRight ();
301
+ if (height (rightChild .getLeft ()) > height (rightChild .getRight ())) {
303
302
n .setRight (rotateRight (n .getRight ()));
304
303
}
305
304
n = rotateLeft (n );
306
305
} else if (balance > 1 ) { // left-heavy case
307
- if (height (n .getLeft ().getRight ()) > height (n .getLeft ().getLeft ())) {
306
+ RangeTreeNode <Integer > leftChild = n .getLeft ();
307
+ if (height (leftChild .getRight ()) > height (leftChild .getLeft ())) {
308
308
n .setLeft (rotateLeft (n .getLeft ()));
309
309
}
310
310
n = rotateRight (n );
@@ -320,26 +320,29 @@ private static RangeTreeNode<Integer> rebalance(RangeTreeNode<Integer> n) {
320
320
* @return The root node of the updated Range Tree.
321
321
*/
322
322
public static RangeTreeNode <Integer > delete (RangeTreeNode <Integer > node , int val ) {
323
- if (node .getLeft ().getLeft () == null && node .getLeft ().getRight () == null
324
- && val == node .getLeft ().getVal ()) { // left node is the leaf node
325
- node .setVal (node .getRight ().getVal ());
323
+ RangeTreeNode <Integer > leftChild = node .getLeft ();
324
+ RangeTreeNode <Integer > rightChild = node .getRight ();
325
+
326
+ if (leftChild .getLeft () == null && leftChild .getRight () == null
327
+ && val == leftChild .getVal ()) { // left node is the leaf node
328
+ node .setVal (rightChild .getVal ());
326
329
node .setLeft (null );
327
330
node .setRight (null );
328
- } else if (node . getRight (). getLeft () == null && node . getRight () .getRight () == null
329
- && val == node . getRight () .getVal ()) { // right node is the leaf node
331
+ } else if (rightChild . getLeft () == null && rightChild .getRight () == null
332
+ && val == rightChild .getVal ()) { // right node is the leaf node
330
333
node .setLeft (null );
331
334
node .setRight (null );
332
335
} else {
333
336
if (val <= node .getVal ()) {
334
- if (node . getLeft () != null ) {
335
- node .setLeft (delete (node . getLeft () , val ));
337
+ if (leftChild != null ) {
338
+ node .setLeft (delete (leftChild , val ));
336
339
}
337
340
if (val == node .getVal ()) { // duplicate node
338
- node .setVal (getMostRight (node . getLeft () ).getVal ()); // update the duplicate key
341
+ node .setVal (getMostRight (leftChild ).getVal ()); // update the duplicate key
339
342
}
340
343
} else {
341
- if (node . getRight () != null ) {
342
- node .setRight (delete (node . getRight () , val ));
344
+ if (rightChild != null ) {
345
+ node .setRight (delete (rightChild , val ));
343
346
}
344
347
}
345
348
}
0 commit comments