Segment tree in Java
In this tutorial, we will see how a segment tree is implemented in Java and also on how to build a segment tree, update a value in the segment tree and query in a segment tree in Java.
A segment tree is a data structure that allows answering a range of queries and updates over an array.
Let us consider an array ‘A’ of size ‘N’ corresponding to the segment tree ‘T’.
- The root node of the T represents the whole array as [0:N-1].
- Now the root node must be divided into half of the root node i.e A[0:(N-1)/2] and A[0:((N-1)/2)+1].
- Again each child node is divided into equal halves.
- The total number of nodes in a segment tree can be either 2N or 2N-1.
Once a segment tree is built the user can update a value in an array and query value in a segment tree.
A simple Java program to build, update and query value in a segment tree
class SegmentTree{ int[] tree; SegmentTree(int n){ tree = new int[n]; } void build(int[] arr, int node, int start, int end){ if(start == end){ tree[node] = arr[start]; } else{ int mid = (start + end)/2; build(arr, 2*node+1, start, mid); build(arr, 2*node+2, mid+1, end); tree[node] = tree[2*node+1] + tree[2*node+2]; } } void update(int[] arr, int node, int index, int val, int start, int end){ if(start == end){ arr[index] += val; tree[node] += val; } else{ int mid = (start + end)/2; if(start <= index && index <= mid){ update(arr, 2*node+1, index, val, start, mid); } else{ update(arr, 2*node+2, index, val, mid + 1, end); } tree[node] = tree[2*node+1] + tree[2*node+2]; } } int query(int node, int start, int end, int left, int right){ if(right < start || end < left){ return 0; } if(left <= start && end <= right){ return tree[node]; } int mid = (start + end)/2; int p1 = query(2*node+1, start, mid, left, right); int p2 = query(2*node+2, mid+1, end, left, right); return p1 + p2; } } public class Tasktest{ public static void main(String[] args){ int arr[] = {11, 22, 33, 4, 5, 6, 45, 74, 8}; // user can give any values int n = arr.length; int height = (int)( Math.log(n)/Math.log(2) )+ 1; int tree_nodes = (int) Math.pow(2, height+1); SegmentTree ob = new SegmentTree(tree_nodes); ob.build(arr, 0, 0, n-1); for(int i = 0; i < tree_nodes; i++){ System.out.print(ob.tree[i] + " "); } System.out.println(); System.out.println(ob.query(0, 0, n-1, 0, 1)); } }
output: 208 75 133 66 9 51 82 33 33 4 5 6 45 74 8 11 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 33
You may also read:
Leave a Reply