Skip to content

Commit 74ee323

Browse files
Add files via upload
1 parent 6289b53 commit 74ee323

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed

tree/segment-tree/SegmentTree.java

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package segmenttree;
2+
3+
public class SegmentTree {
4+
5+
private int arr[];
6+
private int N;
7+
private int tree[];
8+
private int size;
9+
10+
public SegmentTree(int[] arr) {
11+
N = arr.length;
12+
this.arr = arr;
13+
int x = (int) Math.ceil(Math.log(N) / Math.log(2));
14+
size = (int) (2 * Math.pow(2, x) - 1);
15+
tree = new int[size];
16+
}
17+
18+
// O(N)
19+
public void build() {
20+
21+
int node = 0;
22+
int start = 0;
23+
int end = N - 1;
24+
25+
build(node, start, end);
26+
27+
}
28+
29+
/*
30+
*
31+
* Each node of Segment Tree is storing sum of all the element
32+
* in range. For example [1:3] = arr[1]+arr[2]+arr[3]
33+
*
34+
*/
35+
private void build(int node, int start, int end) {
36+
37+
if (start == end) {
38+
tree[node] = arr[start];
39+
} else {
40+
int mid = (start + end) / 2;
41+
build(leftChild(node), start, mid);
42+
build(rightChild(node), mid + 1, end);
43+
tree[node] = tree[leftChild(node)] + tree[rightChild(node)];
44+
}
45+
46+
}
47+
48+
//O(log(N))
49+
public void update(int index, int value) {
50+
int node = 0;
51+
int start = 0;
52+
int end = N - 1;
53+
update(node, start, end, index, value);
54+
}
55+
56+
private void update(int node, int start, int end, int index, int value) {
57+
58+
if (start == end) {
59+
arr[index] = value;
60+
tree[node] = value;
61+
} else {
62+
int mid = (start + end) / 2;
63+
if (start <= index && index <= mid) {
64+
update(leftChild(node), start, mid, index, value);
65+
} else {
66+
update(rightChild(node), mid + 1, end, index, value);
67+
}
68+
tree[node] = tree[leftChild(node)] + tree[rightChild(node)];
69+
}
70+
71+
}
72+
73+
//O(log(N))
74+
public int rangeSumQuery(int l,int r){
75+
int node = 0;
76+
int start = 0;
77+
int end = N - 1;
78+
return rangeSumQuery(node,start,end,l,r);
79+
}
80+
81+
private int rangeSumQuery(int node, int start, int end, int l, int r) {
82+
83+
//Outside Range.
84+
if(end<l || start>r){
85+
return 0;
86+
}
87+
//Complete Range.
88+
else if(l<=start && end<=r){
89+
return tree[node];
90+
}
91+
//Partial Range
92+
else{
93+
int mid=(start+end)/2;
94+
int p1=rangeSumQuery(leftChild(node),start,mid,l,r);
95+
int p2=rangeSumQuery(rightChild(node),mid+1,end,l,r);
96+
return p1+p2;
97+
}
98+
}
99+
100+
public int size() {
101+
return size;
102+
}
103+
104+
public int leftChild(int i) {
105+
return 2 * i + 1;
106+
}
107+
108+
public int rightChild(int i) {
109+
return 2 * i + 2;
110+
}
111+
112+
public int parent(int i) {
113+
return (i - 1) / 2;
114+
}
115+
116+
public void displayTree() {
117+
for (int i = 0; i < size; i++) {
118+
System.out.print(tree[i] + " ");
119+
}
120+
}
121+
122+
public void displayArray() {
123+
for (int i = 0; i < N; i++) {
124+
System.out.print(arr[i] + " ");
125+
}
126+
}
127+
128+
}

0 commit comments

Comments
 (0)