1
1
package dataStructures .segmentTree ;
2
2
3
+ /**
4
+ * Implementation of a Segment Tree. Uses SegmentTreeNode as a helper node class.
5
+ */
3
6
public class SegmentTree {
4
7
private SegmentTreeNode root ;
5
8
private int [] array ;
6
9
10
+ /**
11
+ * Helper node class. Used internally.
12
+ */
7
13
private class SegmentTreeNode {
8
14
private SegmentTreeNode leftChild ; // left child
9
15
private SegmentTreeNode rightChild ; // right child
@@ -21,13 +27,17 @@ private class SegmentTreeNode {
21
27
*/
22
28
public SegmentTreeNode (SegmentTreeNode leftChild , SegmentTreeNode rightChild , int start , int end , int sum ) {
23
29
this .leftChild = leftChild ;
24
- this .rightChild = rightChild
30
+ this .rightChild = rightChild ;
25
31
this .start = start ;
26
32
this .end = end ;
27
33
this .sum = sum ;
28
34
}
29
35
}
30
36
37
+ /**
38
+ * Constructor.
39
+ * @param nums
40
+ */
31
41
public SegmentTree (int [] nums ) {
32
42
root = buildTree (nums , 0 , nums .length - 1 );
33
43
array = nums ;
@@ -37,7 +47,7 @@ private SegmentTreeNode buildTree(int[] nums, int start, int end) {
37
47
if (start == end ) {
38
48
return new SegmentTreeNode (null , null , start , end , nums [start ]);
39
49
}
40
- int mid = start + (end - start ) / 2 ;
50
+ int mid = start + (end - start ) / 2 ;
41
51
SegmentTreeNode left = buildTree (nums , start , mid );
42
52
SegmentTreeNode right = buildTree (nums , mid + 1 , end );
43
53
return new SegmentTreeNode (left , right , start , end , left .sum + right .sum );
@@ -68,10 +78,10 @@ private int query(SegmentTreeNode node, int leftEnd, int rightEnd) {
68
78
// poss 2: ^ ^
69
79
// poss 3: ^ ^
70
80
if (leftEnd <= mid ) {
71
- rangeSum += query (node .leftChild , leftEnd , Math .min (rightEnd , mid )); // poss1 / poss2
81
+ rangeSum += query (node .leftChild , leftEnd , Math .min (rightEnd , mid )); // poss1 or poss2
72
82
}
73
83
if (mid + 1 <= rightEnd ) {
74
- rangeSum += query (node .rightChild , Math .max (leftEnd , mid + 1 ), rightEnd ); // poss2 / poss2
84
+ rangeSum += query (node .rightChild , Math .max (leftEnd , mid + 1 ), rightEnd ); // poss2 or poss3
75
85
}
76
86
return rangeSum ;
77
87
}
@@ -91,13 +101,14 @@ public void update(int idx, int val) {
91
101
private void update (SegmentTreeNode node , int idx , int val ) {
92
102
if (node .start == node .end && node .start == idx ) {
93
103
node .sum = val ; // previously, node held a single value; now updated
104
+ return ;
94
105
}
95
106
int mid = node .start + (node .end - node .start ) / 2 ;
96
107
if (idx <= mid ) {
97
108
update (node .leftChild , idx , val );
98
109
} else {
99
110
update (node .rightChild , idx , val );
100
111
}
101
- node .sum = node .leftChild .sum + node .rightChild .sum ; // propagate updates up
112
+ node .sum = node .leftChild .sum + node .rightChild .sum ; // propagate updates up
102
113
}
103
114
}
0 commit comments