上一篇
在算法竞赛和实际工程中,C++线段树是一种非常高效的数据结构,用于处理区间查询和区间更新问题。本教程将带你从零开始,一步步理解并实现线段树,即使你是编程小白也能轻松上手!
线段树(Segment Tree)是一种二叉树结构,每个节点代表一个区间。它能够高效地支持以下两种操作:
假设我们有一个数组 arr[0...n-1],线段树会将其构建成一棵完全二叉树:
[0, n-1]下面我们以区间求和为例,展示如何用C++数据结构实现线段树。
#include <vector>#include <iostream>using namespace std;class SegmentTree {private: vector<long long> tree; // 线段树数组 vector<long long> arr; // 原始数组 int n; // 数组长度 // 构建线段树 void build(int node, int start, int end) { if (start == end) { tree[node] = arr[start]; } else { int mid = (start + end) / 2; build(2 * node, start, mid); build(2 * node + 1, mid + 1, end); tree[node] = tree[2 * node] + tree[2 * node + 1]; } } // 区间查询 long long query(int node, int start, int end, int l, int r) { if (r < start || end < l) { return 0; // 区间不相交 } if (l <= start && end <= r) { return tree[node]; // 完全包含 } int mid = (start + end) / 2; long long left_sum = query(2 * node, start, mid, l, r); long long right_sum = query(2 * node + 1, mid + 1, end, l, r); return left_sum + right_sum; } // 单点更新 void update(int node, int start, int end, int idx, long long val) { if (start == end) { arr[idx] = val; tree[node] = val; } else { int mid = (start + end) / 2; if (idx <= mid) { update(2 * node, start, mid, idx, val); } else { update(2 * node + 1, mid + 1, end, idx, val); } tree[node] = tree[2 * node] + tree[2 * node + 1]; } }public: SegmentTree(vector<long long>& input) { arr = input; n = arr.size(); tree.resize(4 * n); // 通常开4倍空间 build(1, 0, n - 1); } long long rangeSum(int l, int r) { return query(1, 0, n - 1, l, r); } void updateValue(int idx, long long val) { update(1, 0, n - 1, idx, val); }}; int main() { vector<long long> arr = {1, 3, 5, 7, 9, 11}; // 创建线段树 SegmentTree st(arr); // 查询区间 [1, 3] 的和 cout << "Sum of [1, 3]: " << st.rangeSum(1, 3) << endl; // 输出: 15 // 更新索引 1 的值为 10 st.updateValue(1, 10); // 再次查询区间 [1, 3] 的和 cout << "Sum of [1, 3] after update: " << st.rangeSum(1, 3) << endl; // 输出: 22 return 0;} 线段树虽然是二叉树,但为了保证完全二叉树的性质并避免越界,通常将数组大小设为原数组长度的4倍。这是数据结构线段树实现中的一个重要细节。
线段树广泛应用于各种需要高效区间操作的场景:
通过本线段树教程,你应该已经掌握了线段树的基本概念、C++实现方法以及使用技巧。线段树是算法竞赛中的利器,也是面试中的高频考点。建议多练习相关题目,加深理解!
记住,掌握C++线段树的关键在于理解其递归构建和查询的过程。动手实现一遍,你会发现它并没有想象中那么复杂!
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025127825.html