推一下关于树状数组的讲解博客:https://blog.csdn.net/bestsort/article/details/80796531
和https://blog.csdn.net/Small_Orange_glory/article/details/81290634
线段树的讲解:https://blog.csdn.net/qq_39826163/article/details/81436440
package Test2;
public class _线段树 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int len = a.length;
SegTree t = buildtree(0, len - 1, a);
int sum0_2 = query(t, 0, 2);
int sum1_3 = query(t, 1, 3);// 查询的和包括左区间和有区间
System.out.println(sum0_2);
System.out.println(sum1_3);
}
// 构建线段树
static SegTree buildtree(int l, int r) {
SegTree segtree = new SegTree(l, r);
if (l == r) {
segtree.sum = 0;
return segtree;
}
int mid = (l + r) / 2;
segtree.lson = buildtree(l, mid);
segtree.rson = buildtree(mid + 1, r);
segtree.sum = segtree.lson.sum + segtree.rson.sum;// 也可以求最值
return segtree;
}
// 构建线段树
static SegTree buildtree(int l, int r, int[] a) {
SegTree segtree = new SegTree(l, r);
if (l == r) {
segtree.sum = a[l];
return segtree;
}
int mid = (l + r) / 2;
segtree.lson = buildtree(l, mid, a);
segtree.rson = buildtree(mid + 1, r, a);
segtree.sum = segtree.lson.sum + segtree.rson.sum;// 也可以求最值
return segtree;
}
// 位置x的数据增量为y
static void update(SegTree t, int x, int y) {
if (t == null) {
return;
}
t.sum += y;
int l = t.l;
int r = t.r;
int mid = (l + r) / 2;
if (x <= mid) {
update(t.lson, x, y);
} else {
update(t.rson, x, y);
}
}
// 查询区间[x,y]的和
private static int query(SegTree t, int x, int y) {
// TODO Auto-generated method stub
int l = t.l;
int r = t.r;
if (x <= l && y >= r)
return t.sum;
int mid = (l + r) / 2;
int cnt = 0;
if (x <= mid) {
cnt += query(t.lson, x, y);
}
if (y > mid) {
cnt += query(t.rson, x, y);
}
return cnt;
}
// 单点查询位置
static int query(SegTree t, int k) {
int l = t.l;
int r = t.r;
if (l == r) {
return t.sum;
}
int mid = (l + r) / 2;
if (k <= mid) {
return query(t.lson, k);
}
if (k > mid)
return query(t.rson, k);
return -1;
}
}
class SegTree {
int l, r;// 持有左右区间
int sum;// 区间和
SegTree lson;// 左子树
SegTree rson;// 右子树
public SegTree(int l, int r) {
this.l = l;
this.r = r;
}
}