2-线段树

线段树

1.构建

class Tree
{
struct Node
{
int start;
int end;
int value;
Node(int _start,int _end, int _value) : start(_start), end(_end), value(_value){}
}
int listnum;
int maxlistnum;
Node *list;
public:
~Tree()
{
if(list)
delete[] list;
}
Tree(int* _list,int _listnum) : listnum(_listnum)
{
int num = 1;
while(true)
{
if(num<listnum)
{
num+=2;
continue;
}
else
{
break;
}
}
maxlistnum = num*2-1;
list = new Node[maxlistnum];
for(int i = num-1,j = 0;j<listnum;i++,j++)
{
list[i].value = _list[j];
}
build(0);
}
private:
Node build(int buildnum)
{
if(buildnum*2+2>maxlistnum-1)
{
list[buildnum].start = list[buildnum].end = buildnum+1;
return list[buildnum];
}

Node NodeL = build(buildnum*2+1);
Node NodeR = build(buildnum*2+2);
list[buildnum].start = NodeL.start;
list[buildnum].end = NodeR.end;
list[buildnum].value = NodeL.value+NodeR.value;
return list[buildnum];
}
}

2.区间查询

class Tree
{
int listnum;
int maxlistnum;
Node *list;
public:
int query(int start,int end,int nodenum)
{
if(start<=_start && end>=_end)
return list[]
}
}