用go写一个线段树
时间: 2023-07-01 18:24:29 浏览: 140
下面是 Go 语言实现线段树的示例代码:
```go
package main
import "fmt"
// 线段树结构体
type SegmentTree struct {
left, right int // 当前节点表示的区间左右端点
sum int // 当前节点表示的区间内的和
leftChild *SegmentTree // 左子节点
rightChild *SegmentTree // 右子节点
}
// 创建线段树
func build(nums []int, left, right int) *SegmentTree {
if left == right {
return &SegmentTree{left: left, right: right, sum: nums[left]}
}
mid := (left + right) / 2
leftChild := build(nums, left, mid)
rightChild := build(nums, mid+1, right)
return &SegmentTree{left: left, right: right, sum: leftChild.sum + rightChild.sum, leftChild: leftChild, rightChild: rightChild}
}
// 区间查询
func query(root *SegmentTree, left, right int) int {
if root.left == left && root.right == right {
return root.sum
}
mid := (root.left + root.right) / 2
if right <= mid {
return query(root.leftChild, left, right)
} else if left > mid {
return query(root.rightChild, left, right)
} else {
return query(root.leftChild, left, mid) + query(root.rightChild, mid+1, right)
}
}
// 区间修改
func modify(root *SegmentTree, index, val int) {
if root.left == root.right {
root.sum = val
return
}
mid := (root.left + root.right) / 2
if index <= mid {
modify(root.leftChild, index, val)
} else {
modify(root.rightChild, index, val)
}
root.sum = root.leftChild.sum + root.rightChild.sum
}
func main() {
nums := []int{1, 3, 5, 7, 9, 11}
root := build(nums, 0, len(nums)-1)
fmt.Println(query(root, 0, 2)) // 输出 9
modify(root, 1, 2)
fmt.Println(query(root, 0, 2)) // 输出 8
}
```
这段代码实现了线段树的基本功能,包括创建线段树、区间查询和区间修改。其中 `SegmentTree` 结构体表示线段树节点,包括左右端点、当前区间内的和以及左右子节点。`build` 函数用于创建线段树,`query` 函数用于区间查询,`modify` 函数用于区间修改。在 `main` 函数中,创建了一个数组并构建了对应的线段树,然后进行了区间查询和修改操作。
阅读全文