class seg_tree_node {
public:
int start = 0;
int end = 0;
int val = 0;
seg_tree_node* left;
seg_tree_node* right;
seg_tree_node(int s, int e, int v, seg_tree_node* l = nullptr, seg_tree_node* r = nullptr) {
start = s;
end = e;
val = v;
left = l;
right = r;
}
};
class seg_tree {
public:
seg_tree(std::vector<int>& v) {
data.swap(v);
}
~seg_tree() {
if (root) {
clean(root);
}
}
seg_tree_node* buildTree(int start, int end) {
if (start == end)
return new seg_tree_node(start, end, data[start]);
int mid = (start + end) >> 1;
seg_tree_node* left = buildTree(start, mid);
seg_tree_node* right = buildTree(mid + 1, end);
return new seg_tree_node(start, end, left->val + right->val, left, right);
}
void updateTree(int index, int val,seg_tree_node* node) {
if (node->start == index && node->end == index) {
node->val = val;
return;
}
int mid = (node->start + node->end) >> 1;
if (index <= mid) {
updateTree(index, val, node->left);
}
else {
updateTree(index, val, node->right);
}
}
int queryTree(int s, int e, seg_tree_node* node) {
if (node->start == s && node->end == e) {
return node->val;
}
int mid = (node->start + node->end) >> 1;
if (mid < s) {
return queryTree(s, e, node->right);
}
else if (mid >= e) {
return queryTree(s, e, node->left);
}
else {
return queryTree(s, mid, node->left) + queryTree(mid + 1, e, node->right);
}
}
private:
void clean(seg_tree_node* node) {
if (!node)
return;
seg_tree_node* left = node->left;
clean(left);
seg_tree_node* right = node->right;
clean(right);
delete node;
node = nullptr;
}
private:
std::vector<int> data;
seg_tree_node* root = nullptr;
};
一个简单的segment tree实现
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 说真的,拥有梦想的人太多了,可在命运闭上眼睛时候,仍旧苦苦坚守的能有几个?很多时候,我们沦落为平庸的人,呼应了北岛...