请你用c++写一个权值线段树中查询区间最左侧的值
下面是一个用C++实现的权值线段树,其中包括了查询区间最左侧的值的功能:
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
// 结点结构体
struct Node {
int value; // 结点的值
int left; // 结点表示的区间左端点
int right; // 结点表示的区间右端点
};
// 权值线段树类
class SegTree {
private:
vector<Node> tree; // 线段树数组
vector<int> arr; // 原始数组
// 建立线段树
void build(int node, int left, int right) {
if (left == right) {
tree[node].value = arr[left];
tree[node].left = left;
tree[node].right = right;
return;
}
int mid = (left + right) / 2;
build(node * 2, left, mid);
build(node * 2 + 1, mid + 1, right);
tree[node].value = min(tree[node * 2].value, tree[node * 2 + 1].value);
tree[node].left = left;
tree[node].right = right;
}
// 查询区间最左侧的值
int query(int node, int left, int right) {
if (tree[node].left == left && tree[node].right == right) {
return tree[node].value;
}
int mid = (tree[node].left + tree[node].right) / 2;
if (right <= mid) {
return query(node * 2, left, right);
}
else if (left > mid) {
return query(node * 2 + 1, left, right);
}
else {
return min(query(node * 2, left, mid), query(node * 2 + 1, mid + 1, right));
}
}
public:
// 构造函数
SegTree(const vector<int>& input) {
arr = input;
int n = input.size();
tree.resize(4 * n); // 根据输入数组大小初始化线段树数组
build(1, 0, n - 1); // 建立线段树
}
// 查询区间最左侧的值
int queryLeft(int left, int right) {
return query(1, left, right);
}
};
int main() {
vector<int> input = {4, 1, 5, 3, 2, 6};
SegTree segTree(input);
int left = 2;
int right = 4;
int minValue = segTree.queryLeft(left, right);
cout << "最左侧的值为:" << minValue << endl;
return 0;
}
该实现使用了一个结点结构体来表示树中的每个结点,其中包括了结点的值、结点表示的区间的左端点和右端点。在建立线段树时,每个结点的值为其左子树和右子树中的最小值。在查询区间最左侧的值时,根据当前结点的区间以及查询的区间,递归地向左子树或右子树查询,直到找到对应的叶子结点,返回其值。
在示例中,输入数组为{4, 1, 5, 3, 2, 6},查询区间为2到4,输出结果为最左侧的值3
原文地址: https://www.cveoy.top/t/topic/iAud 著作权归作者所有。请勿转载和采集!