class NumArray {
public Node root;
public NumArray(int[] nums) {
root = BuildTree(0,nums.length-1,nums);
}
public void update(int index, int val) {
updateNode(root,index,val);
}
public int sumRange(int left, int right) {
return query(left,right,root);
}
public class Node {
int val;
int l,r;
Node right = null;
Node left = null;
public Node(int l, int r){
this.l = l;
this.r = r;
}
public Node(int l, int r,int val){
this.l = l;
this.r = r;
this.val = val;
}
}
public Node BuildTree(int left, int right,int[] nums){
if(left == right){
return new Node(left,right,nums[left]);
}
int mid = (left + right) >>>1;
Node root = new Node(left,right);
root.left = BuildTree(left,mid,nums);
root.right = BuildTree(mid+1,right,nums);
root.val = root.left.val + root.right.val;
return root;
}
public void updateNode(Node root, int x, int val){
if(root.l == root.r){
root.val = val;
return;
}
int mid = (root.l + root.r) >>>1;
if(x <= mid){
updateNode(root.left,x,val);
}else{
updateNode(root.right,x,val);
}
root.val = root.left.val + root.right.val;
return ;
}
public int query(int left, int right, Node root){
if((left == root.l && right == root.r) || (root.l == root.r)){
return root.val;
}
int mid = (root.l + root.r) >>>1 ;
if(right <= mid){
return query(left,right,root.left);
}else if(left > mid){
return query(left,right,root.right);
}else{
return query(left,right,root.left) + query(left,right,root.right);
}
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* obj.update(index,val);
* int param_2 = obj.sumRange(left,right);
*/
leetcode 307 线段树入门
于 2022-12-22 00:39:03 首次发布