线段树有关的操作(先大体上知道什么意思):
1
2
3
4
5
线段树前置知识:
由于线段树是一个完美二叉树,所以我们选择的是一维数组来存储线段树的相关知识:
所以:
1如果一个结点是X,则父节点、左儿子、右儿子:
2线段树最多有几个点:tr[4 * n]:
具体操作及实现:
1.build(int u,int l,int r):
如图:
所以对于根节点tr[1],tr[1].l = 1,tr[1].r = 10;
建立的过程非常简单,就是对于上图的一个代码描述,如果有疑惑可以这个代码:(也是非常帮助我们理解递归的一个代码):
#include<iostream>
using namespace std;
const int N = 110;
struct tree{
int l;
int r;
}tr[N];
void build(int u,int L,int R){
tr[u].l = L,tr[u].r = R;
if(L == R) return ;
int mid =( L + R )>> 1;
build(u << 1,L,mid),build(u << 1 | 1,mid + 1,R);
//一般是在这里加上push_up()的操作
}
int main(){
build(1,1,10);
for(int i = 1;i <= 40;i ++){
cout << tr[i].l << " " << tr[i].r << endl;
}
return 0;
}