线段树是一种平衡二叉搜索树(完全二叉树),它将一个线段区间划分成一些单元区间。对于线段树中的每一个非叶子节点[a,b],他的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b],最后的叶子节点数目为N,与数组下标对应。线段树的一般包括建立、查询、插入、更新等操作,建立规模为N的时间复杂度是O(NlogN),其他操作时间复杂度为O(logN)。
平衡二叉搜索树(完全二叉树)是指除了最后一层,其他层都是满的二叉树。
线段树最大的价值是平衡,因为线段树是平衡二叉树。很多题目可以通过平衡二叉树达到完美的时间复杂度。
#include <vector>
//线段树的构造
void build_segment_tree(std::vector<int>& nums, std::vector<int>& value, int pos, int left, int right)
{
if (left==right)
{
value[pos] = nums[left];
return;
}
int mid = (left + right) / 2;
build_segment_tree(nums, value, 2 * pos + 1, left, mid);
build_segment_tree(nums, value, 2 * pos + 2, mid+1, right);
value[pos] = value[2 * pos + 1] + value[2 * pos + 2];
}
//线段树的遍历
void print_segment_tree(std::vector<int>& value, int pos, int left, int right, int layer)
{
for (int i = 0; i < layer; i++)
{
printf("---");
}
printf("[%d %d] [%d]: %d\n", left, right, pos, value[pos]);
if (left==right)
{
return;
}