public class SegmentTree {
@Test
public void test(){
buildMin(0);
int min = query(0, 3, 5);
System.out.println(min);
}
int[] data = {5, 9, 7, 4, 6, 1};
SegNode[] nodes = new SegNode[data.length << 2];
private void buildSum(int index){
SegNode node = nodes[index];
if(node == null){
nodes[index] = new SegNode(0,data.length-1);
node = nodes[index];
}
if (node.start == node.end){
node.val = data[node.start];
}else {
int mid = (node.start + node.end) >> 1;
int left = (index << 1) + 1;
int right = left+1;
nodes[left] = new SegNode(node.start,mid);
nodes[right] = new SegNode(mid+1,node.end);
buildSum(left);
buildSum(right);
node.val = nodes[left].val + nodes[right].val;
}
}
private void buildMin(int index){
SegNode node = nodes[index];
if(node == null){
nodes[index] = new SegNode(0,data.length-1);
node = nodes[index];
}
if (node.start == node.end){
node.val = data[node.start];
}else{
int mid = (node.start + node.end) >> 1;
int left = (index << 1) + 1;
int right = left+1;
nodes[left] = new SegNode(node.start,mid);
nodes[right] = new SegNode(mid+1,node.end);
buildMin(left);
buildMin(right);
node.val = Math.min(nodes[left].val, nodes[right].val);
}
}
private int query(int index,int start,int end){
SegNode node = nodes[index];
if(start <= node.start && node.end <= end)
return node.val;
if (start > node.end || node.end < node.start){
return Integer.MAX_VALUE;
}else{
return Math.min(query((index << 1)+1,start,end),query((index << 1)+2,start,end));
}
}
private int querySum(int index,int start,int end){
SegNode node = nodes[index];
if(start == node.start && node.end == end)
return node.val;
if (start > node.end || node.end < node.start){
return 0;
}else{
int mid = (node.start + node.end) >> 1;
return query((index << 1) + 1,start,mid < end ? mid : end) + query((index << 1) + 2,mid + 1 > start ? (mid+1) : start,end);
}
}
private int updateForOneSum(int index,int updateIndex,int val){
SegNode node = nodes[index];
int remain;
if(node.start == node.end && node.start == updateIndex){
remain = val - node.val;
node.val = val;
return remain;
}else{
int mid = (node.start + node.end) >> 1;
if(updateIndex <= mid){
remain = updateForOneSum((index << 1) + 1,updateIndex,val);
}else{
remain = updateForOneSum((index << 1) + 2,updateIndex,val);
}
}
node.val += remain;
return remain;
}
private void updateForOne(int index,int updateIndex,int val){
SegNode node = nodes[index];
if(node.start == node.end && node.start == updateIndex){
node.val = val;
}else{
int mid = (node.start + node.end) >> 1;
int left = (index << 1) + 1;
int right = left + 1;
if(updateIndex <= mid){
updateForOneSum(left,updateIndex,val);
}else{
updateForOneSum(right,updateIndex,val);
}
node.val = Math.min(nodes[left].val,nodes[right].val);
}
}
class SegNode{
int start;
int end;
int val;
public SegNode(int s,int e){
start = s;
end = e;
}
}
}
转载请注明原文地址:https://blackberry.8miu.com/read-6750.html