[芝士之线段树]

线段树(Segment Tree)是一种用于解决区间查询问题的数据结构。它的设计思想是将一个线性区间划分为多个较小的子区间,并在每个子区间上构建一颗树形结构。

线段树的每个节点代表一个区间,并存储该区间内的一些信息,比如区间的和、最大值、最小值等。根节点表示整个区间,而叶子节点表示单个元素。

构建线段树的过程可以使用递归或迭代的方式进行。递归构建的过程是从根节点开始,将当前区间划分为两半,然后递归地构建左子树和右子树。

下面是一个具体的例子,展示如何使用线段树求解区间的和:

// 定义线段树节点结构
struct Node {
    int left; // 左子节点的索引
    int right; // 右子节点的索引
    int sum; // 当前区间的和
};

// 构建线段树
void build(int root, int left, int right, int* arr, Node* tree) {
    tree[root].left = left;
    tree[root].right = right;
    if (left == right) {
        tree[root].sum = arr[left];
        return;
    }
    int mid = (left + right) / 2;
    build(root * 2, left, mid, arr, tree); // 递归构建左子树
    build(root * 2 + 1, mid + 1, right, arr, tree); // 递归构建右子树
    tree[root].sum = tree[root * 2].sum + tree[root * 2 + 1].sum; // 更新当前节点的和
}

// 查询区间的和
int query(int root, int left, int right, Node* tree) {
    if (left <= tree[root].left && right >= tree[root].right) {
        return tree[root].sum; // 当前节点的区间完全包含在查询区间中
    }
    if (right < tree[root].left || left > tree[root].right) {
        return 0; // 当前节点的区间与查询区间不相交
    }
    return query(root * 2, left, right, tree) + query(root * 2 + 1, left, right, tree); // 递归查询左右子树
}

通过以上代码,我们可以构建一个线段树 tree,然后对其进行查询操作 query(root, left, right),其中 root 是根节点的索引,left 和 right 是查询区间的左右边界。

线段树的优点是能够快速进行区间查询,时间复杂度为 O(logN),其中 N 是数组的大小。当处理需要频繁进行区间操作的问题时,线段树是一种非常有用的数据结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值