树状数组,看起来像树的数组
先贴代码,图解后续补
树状数组,求区间和:
// 树状数组,求区间和
type TreeArray struct {
originArray []int
treeArray []int
Len int
}
func (t *TreeArray) Init(array []int) {
t.Len = len(array)
// 0~n-1 转换为 1-n
t.originArray = []int{0}
t.originArray = append(t.originArray, array...)
t.treeArray = make([]int, t.Len+1)
}
func (t *TreeArray) build() {
for i := 1; i <= t.Len; i++ {
t.addValue(i, t.originArray[i])
}
}
// 单点更新
func (t *TreeArray) addValue(index int, value int) {
// 递归更新,每次找父节点
for ; index <= t.Len; index += index & -index {
t.treeArray[index] += value
}
}
// 前缀查询
func (t *TreeArray) prefixQuery(index int) int {
var sum int
for ; index >= 1; index &= index - 1 {
sum += t.treeArray[index]
}
return sum
}
// 区间查询
func (t *TreeArray) sectionQuery(left int, right int)