下面是一个用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

请你用c++写一个权值线段树中查询区间最左侧的值

原文地址: https://www.cveoy.top/t/topic/iAud 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录