目录
前言
A.建议
1.学习算法最重要的是理解算法的每一步,而不是记住算法。
2.建议读者学习算法的时候,自己手动一步一步地运行算法。
tips:文中的(如果有)对数,则均以2为底数
B.简介
线段树是一种用于解决区间查询问题的数据结构,它通过将区间划分成更小的子区间,并在每个节点中存储对应区间的信息,从而实现高效的区间查询和更新操作。
一 代码实现
假设我们要解决的问题是在一个数组中查询某个区间的和。首先,我们需要建立线段树,然后可以对树进行查询操作。
#include <stdio.h>
#include <stdlib.h>
// 线段树节点的定义
typedef struct {
int start, end; // 区间的起始和结束位置
int sum; // 区间的和
} SegmentTreeNode;
// 构建线段树
SegmentTreeNode* buildSegmentTree(int* arr, int start, int end) {
if (start > end) {
return NULL;
}
// 创建当前节点
SegmentTreeNode* node = (SegmentTreeNode*)malloc(sizeof(SegmentTreeNode));
node->start = start;
node->end = end;
// 如果是叶子节点,直接将数组中的值赋给节点
if (start == end) {
node->sum = arr[start];
} else {
// 如果不是叶子节点,递归构建左右子树,并计算当前节点的和
int mid = (start + end) / 2;
node->sum = 0; // 初始化为0
node->left = buildSegmentTree(arr, start, mid);
node->right = buildSegmentTree(arr, mid + 1, end);
// 计算当前节点的和
if (node->left != NULL) {
node->sum += node->left->sum;
}
if (node->right != N